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的编译原则相违背,但如果内部类是静态内部类,则其中可以定义静态元素。

楼主你的原因有两个问题,我最近也被这个内部类问题困然很久,我借你宝地提出,如果你有好的解释希望大家共享:
1、如果内部类只被包含他的那个外部类使用,那你怎么解释Map中的Entry类这种现象呢?
2、首先类的加载都是第一次主动使用才会加载。非静态内部类在我建立一个外部类对象时才会加载,但此时我再去加载这个内部类的的静态部分,这个逻辑没有问题。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-10-21
这么想吧 非静态内部类相当于实例变量,加载外部类的时候先加载静态代码属性方法代码块然后才是其他对应的部分,如果此时实例变量中包含静态代码块 那么我们到底改是怎么个加载顺序啦。不明白继续追问本回答被提问者采纳
相似回答