我的代码是这样的:
public class HelloWorld{
{
System.out.println("field init " + this.getName());
}
private String name = null;
private InnerClass inner = new InnerClass(this);
private String getName() {
return name;
}
public HelloWorld() {
name = "hello world";
System.out.println("class init");
}
private class InnerClass {
public InnerClass(HelloWorld hello) {
System.out.println((hello == null));
}
}
public static void main(String []args){
HelloWorld hello = new HelloWorld();
System.out.println("Hello World.");
}
}
据我所知,字段初始化在构造函数之前,所以为什么" this.getName()"可以被称为"这= = null"是假的?
答案 0 :(得分:1)
如果尚未创建实例,那么调用实例初始化程序块是没有意义的,因为实例初始化程序块的目的是初始化(设置实例的初始信息(this
)。
因此,JVM创建的实例将所有字段设置为"所有位关闭"默认情况下,设置this
以引用该实例,然后执行您指定的任何实例初始化。
JLS§12.5: Creation of New Class Instances和JVMS§4.10.2.4中的更多内容。
旁注:
据我所知,字段初始化在构造函数
之前
实际上,是的; Java编译器将实例初始化代码预先添加到您指定的每个构造函数的开头。
答案 1 :(得分:0)
请记住,Java中的所有类都有java.lang.Object
作为(终极)基类。在您的类中进行任何字段初始化或构造之前,已经设置了该基类的this
指针。
因此,它永远不会是null
。