在现场初始化期间,为什么"这个"不是null并且可以调用所有方法吗?" this"参考?

时间:2016-08-18 08:57:39

标签: 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 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"是假的?

2 个答案:

答案 0 :(得分:1)

如果尚未创建实例,那么调用实例初始化程序块是没有意义的,因为实例初始化程序块的目的是初始化(设置实例的初始信息(this)。

因此,JVM创建的实例将所有字段设置为"所有位关闭"默认情况下,设置this以引用该实例,然后执行您指定的任何实例初始化。

JLS§12.5: Creation of New Class InstancesJVMS§4.10.2.4中的更多内容。

旁注:

  

据我所知,字段初始化在构造函数

之前

实际上,是的; Java编译器将实例初始化代码预先添加到您指定的每个构造函数的开头。

答案 1 :(得分:0)

请记住,Java中的所有类都有java.lang.Object作为(终极)基类。在您的类中进行任何字段初始化或构造之前,已经设置了该基类的this指针。

因此,它永远不会是null