关于继承中的新关键字打印输出的顺序是什么?

Jam*_*Xia 1 java inheritance constructor upcasting

这实际上是我感到困惑的一个面试问题的一部分.

class A
{
   public A()
   {
        System.out.println("A") ;
    }
 }

 class B extends A
 {
     public B()
     {
         System.out.println("B") ;
     }
 }


 A a1 = new B();
 System.out.println() ;
 A a2 = (A) new B() ;
Run Code Online (Sandbox Code Playgroud)

所以问题是打印出来的是什么?

起初我以为它应该打印出来

B
A

B
A
Run Code Online (Sandbox Code Playgroud)

但是在我跑回家后,它给了

A
B

A
B
Run Code Online (Sandbox Code Playgroud)

我理解它是继承,然后将B向上转换为A,它也是合法的语法,但为什么B之前的A打印?

Jon*_*eet 7

为什么B之前打印?

因为超类构造函数的主体基本上是在子类构造函数的主体之前执行的.

B()构造函数隐式地想象为:

public B()
{
    super(); // This invokes A's constructor
    System.out.println("B") ;
}
Run Code Online (Sandbox Code Playgroud)

完整的详细信息在JLS 12.5中.特别是:

此构造函数不以同一类(使用this)中另一个构造函数的显式构造函数调用开头.如果此构造函数用于Object以外的类,则此构造函数将以显式或隐式调用超类构造函数(using super)开头.使用这五个相同的步骤评估参数并递归处理超类构造函数调用.