Java中非静态内部类为什么不能有static属性,而可以有final static常量(编译期常量)

Java中非静态内部类为什么不能有static属性

Java中非静态内部类为什么不能有static属性,而可以有final static常量(编译期常量)

上面出错的原因:
首先我们要了解

  1. 对于JVM在类加载期间,初始化实例对象前需要完成对静态变量的初始化。
  2. 内部类静态变量d在外部类进行加载的时候则进行初始化(记住这里内部类还并没有被加载,内部类都还没加载凭什么加载其内部类中的静态变量,这个时候看1中所描述的,这样就存在矛盾)。

为什么非静态内部类又可以存在final static修饰的(运行时)常量呢?

Java中非静态内部类为什么不能有static属性,而可以有final static常量(编译期常量)

主要原因是对于编译器在编译期间*可以确定值的常量在使用到的地方都会用其值代替符号引用,不如上面的d = 10,在别的任何地方如果使用到这个变量d,其所在的位置都会被10所代替。因此不存在类加载初始化的问题。

注意上面特别标记了是编译期间可以确定的值,但是对于编译期间不能确定值的常量,其将会和上面第一个问题中描述的一样,非静态内部类不能含有静态变量情况是一致的。如下对于Math.random()产生的随机数无法在编译期间就确定,自然无法在编译期间就对其进行替换,其出现的问题就和只有一个static修饰的变量是相同的了。
Java中非静态内部类为什么不能有static属性,而可以有final static常量(编译期常量)