Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在字段初始化期间,为什么;这";不为null并且可以调用所有方法?什么是;这";提到_Java - Fatal编程技术网

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刚刚为其创建的实例。所以在这个意义上,“构造函数”是错误的,“初始值设定项”应该更正确。但现在不会改变了。:-)术语“构造器”已经太成熟了(跨越了一系列语言)。