19

私はAPJavaの学生で、試験の練習をしています。私はこの質問に出くわしました、そして私は答えを理解していません:

次のクラスを検討してください。

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()、と呼ばれます。オブジェクトはタイプBであるため、BのバージョンmethodOneが呼び出さBれて出力されます。その後、Bコンストラクターは実行を継続し、出力*されます。

(Aのコンストラクターのように)コンストラクターからオーバーライド可能なメソッドを呼び出すことは非常に悪い習慣であることに注意する必要があります。それはまだ構築されていないオブジェクトのメソッドを呼び出します。

于 2012-05-01T21:55:40.897 に答える
2

基本クラスは、派生クラスの前に構築する必要があります。

最初A()に呼び出され、どの呼び出しmethodOne()が印刷されBます。

次に、B()を印刷すると呼ばれます*

于 2012-05-01T21:53:23.760 に答える