有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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呢


共 (2) 个答案

  1. # 1 楼答案

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

    因此,它永远不可能是null

  2. # 2 楼答案

    如果尚未创建实例,那么调用实例初始值设定项块就没有什么意义,因为实例初始值设定项块的目的是初始化(设置初始信息)实例(^{

    因此,JVM创建实例时,所有字段都设置为“all bits off”默认值,将this设置为引用该实例,然后执行指定的任何实例初始化

    更多信息请访问JLS§12.5: Creation of New Class InstancesJVMS§4.10.2.4


    旁注:

    As far as I know, field initialization is before constructor

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