は、私は、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関数のコールの結果がどうなるか書かなければなりませんでした。 ご覧のとおり、ほとんどの回答が間違っています。 サブクラスのコンストラクタで作成されたのスーパークラス型の変数を持つときに、どのようなクラス関数が呼び出されるかをどのように判断することができますか?
[Java動的バインディングとメソッドのオーバーライド]の可能な複製(http://stackoverflow.com/questions/321864/java-dynamic-binding-and-method-overriding) – Seelenvirtuose