java为什么非静态内部类中不能有static修饰的属性,但却可以有常量?

Posted wq3435

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java为什么非静态内部类中不能有static修饰的属性,但却可以有常量?相关的知识,希望对你有一定的参考价值。

如:
public class InnerClassDemo{
int x;
class A{
static int a = 0;//这样写是不合法的.
static final int b=0;//这样写是合法的

}
}

 

java类加载顺序,首先加载类,执行static变量初始化,接下来执行对象的创建,如果我们要执行代码中的变量int a 初始化,那么必须先执行加载外部类,再加载内部类,最后初始化静态变量 a ,问题就出在加载内部类上面,我们可以把内部类看成外部类的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载内部类必须在实例化外部类之后完成 ,java虚拟机要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。
(有点绕,呵呵)
而java常量放在内存中常量池,它的机制与变量是不同的,编译时,加载常量是不需要加载类的,所以就没有上面那种矛盾。











以上是关于java为什么非静态内部类中不能有static修饰的属性,但却可以有常量?的主要内容,如果未能解决你的问题,请参考以下文章

java 内部类为啥不能static

在静态方法中new 一个内部类对象和new 一个外部类对象的区别

深入浅析Java中Static Class及静态内部类和非静态内部类的不同

Java关键字-static

一个java内部类有几个分类?

《Java架构筑基》从Java基础讲起——深入理解Static