2012-05-01 19 views
10

私は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 *です。誰か私に方法の呼び出しの順序を説明してもらえますか?

+0

printステートメントを 'A'のコンストラクタに追加すると、より明確になることがあります。 –

答えて

27

Bコンストラクタが呼び出されます。 Bコンストラクタの最初の暗黙の命令はsuper()(スーパークラスのデフォルトのコンストラクタを呼び出します)です。そこで、Aのコンストラクタが呼び出されます。 Aのコンストラクタはsuper()を呼び出し、何も出力しないjava.lang.Objectコンストラクタを呼び出します。次にmethodOne()が呼び出されます。オブジェクトはB型であるため、BのバージョンはmethodOneとなり、Bが出力されます。その後、Bコンストラクタは実行を継続し、*が出力されます。

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

+4

+1、特に悪い習慣のビットの場合。 –

+0

そして、「クラスA」がそれを期待する方法では、overiddenメソッドはうまくいかないかもしれません。 –

+0

私はsuper()への暗黙の呼び出しについて知らなかった、ありがとう! – user1104775

2

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

Bを出力するを呼び出す最初のA()が呼び出されます。

B()が呼び出され、*が印刷されます。