java在字段初始化期间,为什么“this”不为null并且可以调用所有方法?“这”指的是什么?
我的代码如下:
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()”而“this==null”是false呢
# 1 楼答案
请记住,Java中的所有类都将
java.lang.Object
作为其(最终)基类。在类中进行任何字段初始化或构造之前,已经为该基类设置了this
指针因此,它永远不可能是
null
# 2 楼答案
如果尚未创建实例,那么调用实例初始值设定项块就没有什么意义,因为实例初始值设定项块的目的是初始化(设置初始信息)实例(^{)
因此,JVM创建实例时,所有字段都设置为“all bits off”默认值,将
this
设置为引用该实例,然后执行指定的任何实例初始化更多信息请访问JLS§12.5: Creation of New Class Instances和JVMS§4.10.2.4
旁注:
实际上,是的;Java编译器将实例初始化代码前置到您指定的每个构造函数的开头