Java抽象类构造函数

时间:2016-02-11 19:36:47

标签: java inheritance abstract

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

我有抽象超类

public abstract class Superclass {
  public Superclass()
  {
        doSth();
  }
  public abstract void doSth();
}

和子类

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

当我做

Subclass x= new Subclass();
x.doSth();

我明白了:

Value x=0
Value x=10

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

1 个答案:

答案 0 :(得分:7)

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

更多详情:

当您致电Subclass的建设者时,首先调用Superclass的构造函数,该构造函数调用Object的构造函数。然后执行Superclass构造函数的主体,因此执行doSth()。只有在完成Superclass构造函数之后,才会评估Subclass的实例初始化表达式(在您的情况下,赋值x = 10;。在评估它们之前,x仍然包含默认值 - 0,这是您第一次调用doSth()时看到的值。