Java 在字段初始化期间,为什么;这";不为null并且可以调用所有方法?什么是;这";提到
我的代码如下:Java 在字段初始化期间,为什么;这";不为null并且可以调用所有方法?什么是;这";提到,java,Java,我的代码如下: 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 HelloWo
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呢?请记住,Java中的所有类都将
Java.lang.Object
作为它们的(最终)基类。在类中进行任何字段初始化或构造之前,该基类的this
指针已经设置好
因此,它永远不能是
null
如果实例尚未创建,调用实例初始值设定项块就没有什么意义,因为实例初始值设定项块的目的是初始化(设置初始信息)实例(this
)
因此JVM创建实例时,所有字段都设置为“all bits off”默认值,设置this
以引用该实例,然后执行您指定的任何实例初始化
更多的在和
旁注: 据我所知,字段初始化在构造函数之前
事实上,是的;Java编译器将实例初始化代码前置到您指定的每个构造函数的开头。
此
从不为空,因为它引用了您正在调用该方法的实例;如果为null,您将无法调用该方法。另外,请注意,不需要将HelloWorld
传递给InnerClass
:该类是非静态的,因此它已经接收到一个隐式引用(可通过HelloWorld.this
访问)。原因是this.getName()
可以被调用,您不会得到任何nullpointer异常,因为@AndyTurner解释了name=null
,谢谢您的评论,除了InnerClass可以被任何其他类替换,结果是一样的,这里只是一个例子:)我可以这样说吗,这是指类实例,构造函数只是一个处理初始化工作的特殊方法,这个方法和实例的创建无关。@YunpengLee正确。构造函数不创建实例:它只是初始化实例@李云鹏:是的。有时人们会说术语“构造函数”是误导性的(在Java和其他几种语言中),因为它并不真正构造实例,而是初始化JVM刚刚为其创建的实例。所以在这个意义上,“构造函数”是错误的,“初始值设定项”应该更正确。但现在不会改变了。:-)术语“构造器”已经太成熟了(跨越了一系列语言)。