2017-05-20 5 views
1

は、私は、Javaを勉強していると私は、次のコードを与えられました。Javaのサブクラス化:トリガされるメソッドは何ですか?

public class A { 
    public void m(A a) { System.out.println("A.m:A"); } 
    public void m(B b) { System.out.println("A.m:B"); } 
} 

public class B extends A { 
    private void m(C c) { System.out.println("B.m:C"); } 
    public void m(B b) { System.out.println("B.m:B"); } 
} 

public class C extends A { 
    public static void main(String args[]) { 
     A ab = new B(); 
     B bb = new B(); 
     A ac = new C(); 

     ab.m(ac); // My answer: A.m : A || correct 
     ab.m(ab); // My answer: B.m : B || Correct answer: A.m : A 
     ab.m(bb); // My answer: B.m : B || correct 
     bb.m(ac); // My answer: compile error || Correct answer: A.m : A 
     bb.m(ab); // My answer: B.m : B || Correct answer: A.m : A 
     bb.m(bb); // My answer: B.m : B || correct 
     ac.m((A)bb); // My answer: A.m : A || correct 
     bb.m((B)ac); // My answer: compile error || Correct answer: run-time error [Class cast exception] --> I UNDERSTAND THIS 
     bb.m((B)ab); // My answer: B.m : B || correct 
    } 
} 

私は、main関数のコールの結果がどうなるか書かなければなりませんでした。 ご覧のとおり、ほとんどの回答が間違っています。 サブクラスのコンストラクタで作成されたのスーパークラス型の変数を持つときに、どのようなクラス関数が呼び出されるかをどのように判断することができますか?

+1

[Java動的バインディングとメソッドのオーバーライド]の可能な複製(http://stackoverflow.com/questions/321864/java-dynamic-binding-and-method-overriding) – Seelenvirtuose

答えて

0

この種の質問に答えるためには、次の3つのものを検討する必要があります。

  1. あなたがメソッドを呼び出しているオブジェクトのは何の実行時の型を?
  2. メソッドの引数のコンパイル時の型とは何ですか?
  3. もしあれば、引数の変換にエラーはありますか?

(1)宣言の右側を見て答えるために:abbbBである、acタイプCのです。宣言の左側を見て(2)答えるため

abbbBあり、acAで、Aあります。

回答するには、キャストを探し、パート(1)のタイプと比較します。 (A)bbのように、サブクラスを基本クラスに変換することはできます。ただし、コンパイル時にコンパイル時にエラーが発生すると、コンパイル時にエラーが発生し、コンパイル時の型が親である場合は実行時エラーが発生します。

(1)と(2)に対する回答があり、(3)によって引き起こされたエラーを排除したら、ソースコードを見て、タイプに一致する(1)からクラスのメソッドオーバーロードを選択する必要があります(2)からクラスの

+0

ありがとう!非常に詳細でよく説明されている:) – tropicaldc

0

上記の答えは理にかなっているので、私はそのユーザーが既に言ったことを繰り返すつもりはありません。答えが間違っているシナリオ(あなたがすでに理解していると述べたもの以外)は、サブクラスの実装で作成されたスーパークラスオブジェクトを引数としてメソッドmに渡すことに関連しています。上記のすべてのこれらのステートメントで

A ab = new B(); 
B bb = new B(); 
A ac = new C(); 

ab.m(ab); // My answer: B.m : B || Correct answer: A.m : A 
bb.m(ac); // My answer: compile error || Correct answer: A.m : A 
bb.m(ab); // My answer: B.m : B || Correct answer: A.m : A 

実装はサブクラスのですが、あなたが実際にAのオブジェクトを渡しています。これ以上混乱することなく、オブジェクトAのパラメータを取っているメソッドを探すことができます。実際のオブジェクトの実装は、実行時にのみ解決できるためです。

関連する問題