Java:Java不允许在非静态内部类里定义静态成员?这是为什么呢?

非静态内部类的实例是依附于外部类的实例没错,但是静态成员的话无论是外部类的静态成员还是非静态内部类的静态成员不是都可以在类加载时初始化么?求解,为什么说Java不允许在非... 非静态内部类的实例是依附于外部类的实例没错,但是静态成员的话无论是外部类的静态成员还是非静态内部类的静态成员不是都可以在类加载时初始化么?

求解,为什么说Java不允许在非静态内部类里定义静态成员

public class InnerNoStatic // 外部类

{

private class InnerClass // 非静态内部类

{

static // 非法

{

System.out.println("==========");

}

private static int inProp; // 非法

private static void test(){} // 非法

}

}
找到原因了:
1、既然是非静态内部类,说明该类只被包含它的那个外部类使用,是专用的,所以定义成静态的没有意义

2、Java的装载过程是先加载类,然后初始化静态元素(Java编译器会使所有的静态元素在使用前被分配好内存空间)然后非静态的只有在使用的时候才分配内存空间,而内部类是作为外部类的成员存在的,所以非静态的内部类必须等到外部类实例化后才会存在,所以非静态内部类的静态成员(如果合法的话)在类加载时并没有被初始化,这与Java的编译原则相违背,但如果内部类是静态内部类,则其中可以定义静态元素。
展开
 我来答
lanling4444
2017-09-11
知道答主
回答量:15
采纳率:0%
帮助的人:3.8万
展开全部
楼主你的原因有两个问题,我最近也被这个内部类问题困然很久,我借你宝地提出,如果你有好的解释希望大家共享:
1、如果内部类只被包含他的那个外部类使用,那你怎么解释Map中的Entry类这种现象呢?
2、首先类的加载都是第一次主动使用才会加载。非静态内部类在我建立一个外部类对象时才会加载,但此时我再去加载这个内部类的的静态部分,这个逻辑没有问题。
映幻路03
2014-10-21 · TA获得超过348个赞
知道小有建树答主
回答量:130
采纳率:0%
帮助的人:98.2万
展开全部
这么想吧 非静态内部类相当于实例变量,加载外部类的时候先加载静态代码属性方法代码块然后才是其他对应的部分,如果此时实例变量中包含静态代码块 那么我们到底改是怎么个加载顺序啦。不明白继续追问
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式