class Alpha
{
String name = "Alpha";
Alpha()
{
print();
}
void print()
{
System.out.println("Alpha Constructor");
}
}
class Beta extends Alpha
{
int i = 5;
String name = "Beta";
public static void main(String[] args)
{
Alpha a = new Beta();
a.print();//Line1 executes Beta constructor
System.out.println(a.name);//Line 2 displays Alpha instance variable
}
void print()
{
System.out.println(i);
}
}
Run Code Online (Sandbox Code Playgroud)
该程序成功编译并显示以下输出.
0
5
Alpha
Run Code Online (Sandbox Code Playgroud)
问题
a)我不明白为什么Alpha的构造函数没有先被执行.
我相信每个子构造函数都会隐式调用"super()"......对吗?
b)如果Beta的构造函数已经执行,那么为什么打印"5"?(输出中的第二行)
我有点理解的第三行(即将显示Alpha自己的变量,因为尚未对"a"实例变量进行转换)
你在这里犯两个"重罪":
这两个成语都会导致令人惊讶的行为.具体来说,1.导致Beta#print从Alpha构造函数0调用,导致打印,因为您正在调用print单元化的实例Beta.这恰好是因为超级构造函数在子类构造函数之前运行.
总之,从构造函数调用重写方法会导致执行顺序的不必要的反转:控制从超类构造函数传递到子类方法.
至于你关于5打印原因的问题:a.print()不像a.name是一个受动态调度影响的方法调用.因此无论a声明的类型是什么(都是Alpha),Beta#print都会调用该方法(在Alpha构造函数中也是如此,但在i初始化变量之前).
| 归档时间: |
|
| 查看次数: |
1247 次 |
| 最近记录: |