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?
超类的构造函数在子类的isntance初始化表达式之前执行,这就是为什么x在第一次调用时仍然具有默认值0的原因doSth().第二个调用x.doSth()在Subclass实例完全初始化后进行,因此x包含10.
更多细节 :
当你调用constrcutor时Subclass,首先调用构造函数Superclass调用它的构造函数Object.然后Superclass执行构造函数的主体,doSth()执行.只有在完成Superclass构造函数之后,才会计算实例初始化表达式Subclass(在您的情况下,对赋值x = 10;进行求值.在计算它们之前,x仍然包含默认值 - 0,这是您在第一次调用时看到的值doSth().
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |