Java抽象类构造函数

标签 java inheritance abstract

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

我有抽象父类(super class)

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?

最佳答案

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

更多详细信息:

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

关于Java抽象类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35348504/

相关文章:

python - 测试调用重写方法的类中的方法

继承

java - 在命令提示符下运行 jar 文件时显示错误 "JavaFX runtime components are missing, and are required to run this application"

java - Swing JTree 节点可以是哪些类型的对象?

java - Kafka-Streams 加入 2 个带有 JSON 值的主题 |背压机制?

c++ - 对象通用计数器的研制

java - 沟通凝聚力

java - 我有一个抽象类和 2 个子类。如果你不能实例化抽象类,你如何使用它们

C#:在不定义新类的情况下创建抽象类的实例

java - 这是一个有效的抽象类吗?