Java抽象类构造函数

Kni*_*ght 2 java inheritance abstract

我想知道这里发生了什么:

我有抽象的超类

public abstract class Superclass {
  public Superclass()
  {
        doSth();
  }
  public abstract void doSth();
}
Run Code Online (Sandbox Code Playgroud)

和子类

public class Subclass extends Superclass{
   private int x = 10;
   public void doSth()
   {
      System.out.println("Value x="+this.x);        
   }    
}
Run Code Online (Sandbox Code Playgroud)

当我做

Subclass x= new Subclass();
x.doSth();
Run Code Online (Sandbox Code Playgroud)

我明白了:

Value x=0
Value x=10
Run Code Online (Sandbox Code Playgroud)

我不知道为什么首先得到x = 0(为什么从一开始x = 10?)然后x = 10?

Era*_*ran 7

超类的构造函数在子类的isntance初始化表达式之前执行,这就是为什么x在第一次调用时仍然具有默认值0的原因doSth().第二个调用x.doSth()Subclass实例完全初始化后进行,因此x包含10.

更多细节 :

当你调用constrcutor时Subclass,首先调用构造函数Superclass调用它的构造函数Object.然后Superclass执行构造函数的主体,doSth()执行.只有在完成Superclass构造函数之后,才会计算实例初始化表达式Subclass(在您的情况下,对赋值x = 10;进行求值.在计算它们之前,x仍然包含默认值 - 0,这是您在第一次调用时看到的值doSth().