Java 多态性与构造函数

Java 多态性与构造函数,java,polymorphism,Java,Polymorphism,我是一名AP Java学生,正在为考试进行练习。我遇到了这个问题,我不明白答案: 考虑以下类别: public class A { public A() { methodOne(); } public void methodOne() { System.out.print("A"); } } public class B extends A { public B() { System.out.print("*"); } public void methodOne() { S

我是一名AP Java学生,正在为考试进行练习。我遇到了这个问题,我不明白答案:

考虑以下类别:

public class A
{
  public A() { methodOne(); }

  public void methodOne() { System.out.print("A"); }
}

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

  public void methodOne() { System.out.print("B"); }
}
执行以下代码时的输出是什么:

A obj = new B();

正确答案是B*。有人能给我解释一下方法调用的顺序吗?

基类必须在派生类之前构造

首先调用
A()
,调用打印
B的
methodOne()


接下来,调用
B()
,它将打印
*

调用B构造函数。B构造函数的第一条隐式指令是
super()
(调用super类的默认构造函数)。因此,调用了A的构造函数。A的构造函数调用
super()
,它调用java.lang.Object构造函数,该构造函数不打印任何内容。然后调用
methodOne()
。由于对象是类型B,因此调用B的
methodOne
版本,并打印
B
。然后B构造函数继续执行,并打印
*


必须注意的是,从构造函数调用可重写方法(就像a的构造函数那样)是一种非常糟糕的做法:它在尚未构造的对象上调用方法。

a
的构造函数添加一条print语句,它可能会变得更清晰。而且,overidden方法可能无法像
A类
所期望的那样工作。