这个其实涉及到类里面的成员或方法何时初时化的问题
解析DEMO1:
大致可认为:初始化Foo这个类(是类,而不是这个类的实例),这时x变量还没有初始化,它先初始化这个类变量及类方法(通俗点就是静态变量及静态方法):这里就一个main方法。
很显然,由于main方法是有特殊性的:它会被调用,这时它创建了一个Foo的一个实例:Foo a = new Foo();这个时候,才会有一个Foo的实例被创建,并且给x赋值。所以你能打印时能访问到a.x
初始化类、对象的异同点:
初始化类的时候,它可能只是告诉虚拟机:有Foo这么一个类,它有一个x的变量,这个变量是int型的,它还有一个main方法
初始化类的实例时,它是在内存中划出一块来放Foo,并且给x赋值:3
根据以上大致分析,再看demo2:x, Foo a这两个东西其实都不存在于内存中,当然访问不到。
很久没看<深入JVM>了,推荐这本书给你
demo 1:
class Foo {
int x = 3;
public static void main(String[] args) {
Foo a = new Foo();
System.out.println(a.x);
}
}
提问者评价
非常感谢你的回答,同时 liyingjie1的回答也很好,还有好几个人的回答都很棒,这里一并表示感谢!
|