19

我是一名 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*。有人可以向我解释方法调用的顺序吗?

4

2 回答 2

40

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

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

于 2012-05-01T21:55:40.897 回答
2

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

首先A()是调用 which 调用methodOne()which prints B

接下来,B()称为 which prints *

于 2012-05-01T21:53:23.760 回答