Java中普通内部类为何不能有static属性 却可以有常量

public class Outer{
    int x;
    class Inner{
        static int a = 0;//这样写是不合法的.
        static final int b=0;//这样写是合法的
    }
}

java类加载顺序,首先加载类,执行static变量初始化,接下来执行对象的创建,如果我们要执行代码中的变量int a 初始化,那么必须先执行加载外部类,再加载内部类,最后初始化静态变量 a ,问题就出在加载内部类上面,我们可以把内部类看成外部类的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载内部类必须在实例化外部类之后完成 ,java虚拟机要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。

将class Inner看作外部类的非静态成员,它属于对象Outer(即new 出来的Outer()),static int a 属于类Inner 所以先于对象Inner Outer创建出来,矛盾

而java常量放在内存中常量池,它的机制与变量是不同的,编译时,加载常量是不需要加载类的,所以就没有上面那种矛盾。

静态的东西需要在编译时分配内存,而非静态内部类是在实例化的时候才分配内存。所以现在的情况就是有了东西没地方放 static int a 没地方放,因为class Inner还没有实例化

发布了64 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/GracefulGuigui/article/details/103880867