构造函数 - 执行顺序

Und*_*Dog 1 java

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"实例变量进行转换)

Mar*_*nik 5

你在这里犯两个"重罪":

  1. 从构造函数中调用可覆盖的方法;
  2. 声明子类中的实例变量,其名称与超类中的实例变量相同.

这两个成语都会导致令人惊讶的行为.具体来说,1.导致Beta#printAlpha构造函数0调用,导致打印,因为您正在调用print单元化的实例Beta.这恰好是因为超级构造函数在子类构造函数之前运行.

总之,从构造函数调用重写方法会导致执行顺序的不必要的反转:控制从超类构造函数传递到子类方法.

至于你关于5打印原因的问题:a.print()不像a.name是一个受动态调度影响的方法调用.因此无论a声明的类型是什么(都是Alpha),Beta#print都会调用该方法(在Alpha构造函数中也是如此,但在i初始化变量之前).