java为什么非静态内部类中不能有static修饰的属性,但却可以有常量?
2017-01-02 22:55
381 查看
如:
public class InnerClassDemo{
int x;
class A{
static int a = 0;//这样写是不合法的.
static final int b=0;//这样写是合法的
}
}
java类加载顺序,首先加载类,执行static变量初始化,接下来执行对象的创建,如果我们要执行代码中的变量int a 初始化,那么必须先执行加载外部类,再加载内部类,最后初始化静态变量 a ,问题就出在加载内部类上面,我们可以把内部类看成外部类的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载内部类必须在实例化外部类之后完成 ,java虚拟机要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。
(有点绕,呵呵)
而java常量放在内存中常量池,它的机制与变量是不同的,编译时,加载常量是不需要加载类的,所以就没有上面那种矛盾。
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中非静态内部类可以有常量但不能有staic修饰的属性
- Java非静态内部类中为什么不能有静态变量却可以有常量?
- 《为什么非静态内部类中不能有static属性的变量,却可以有static final属性的变量?》
- Java中static为什么不能修饰局部变量?
- Java中static的用法,static、public为什么不能修饰局部变量?
- java中普通的顶级类是不能使用static关键字修饰的。只有内部类可以使用static修饰,也可以不使用staitc关键字修饰。
- Java中声明常量为什么用static修饰
- 为什么JAVA中的属性不能覆盖而方法却可以覆盖
- Java中static为什么不能修饰局部变量?
- Java - Static和Final修饰类属性变量及初始化
- java中interface中的方法为什么不能是static方法?
- static 可以修饰类? java在给类命名不区分大小写
- Java非静态内部类为什么不能有静态成员
- 为什么接口中的常量必须使用public static final修饰
- JAVA梳理(1)——static修饰属性的实际应用
- const修饰的常量 不能被直接修改 但是可以通过指针进行间接修改
- 小结在一个java源文件当中可以有多个类,但是为什么只能有一个public类呢?而当这个类被修饰为public的话,为什么源文件名必须要与类名相同呢?
- static方法可以直接从普通方法(regular method)中调用,但是普通方法不能直接从static方法中调用,为什么?
- Java基础问题:static方法中为什么不能使用非static的方法或变量