public class A{
public static int x = 1;
public int m(A a, B b){
return a.m(b, b) + x;
}
}
public class B extends A {
public int m(A a1, B a2){
if(a1 == a2)
return x;
return super.m(a1,a2);
}
}
これは、私が受けている科目の過去の試験の問題です。
public class Main{
public static void main(String[] args){
B b1 = new B(){int m(A a, A b){ return 10; }};
System.out.println(b1.m(b1, b1));
}
}
問題は、次の出力が何をするかです。1の答えは正解でしたが、その理由がよくわかりませんでした。
B オブジェクトの内部クラスは (A,A) であるためです。(A、B)であるため、スーパーメソッドmをオーバーライドできないと考えるのは正しいですか?2 つのメソッドのパラメーターが交換された場合、オーバーライドできますか?
オーバーライドもオーバーロードもできないため、何もせず、単に B クラスのメソッド m を使用しますか?
オブジェクトの内部クラスは、それ自体でのみ機能しますか? anonクラスのようなものですか?
すべての質問についてお詫び申し上げます。
前もって感謝します。
編集:
これまでの私の理解では、静的型が B に設定されているため、型 B は anon クラスを見ることができません。これが public に設定されていれば、見ることはできますが、それでも使用されません。
これは別の質問で私を混乱させました。
public class A{
public static int x = 1;
public int m(A a, B b){
return a.m(b, b) + x;
}
}
public class Main{
public static void main(String[] args){
A a1=new A();
A a2=new A(){
int m(A a,B b){
return 10;
}};
B b1=new B();
System.out.println(a1.m(a2,b1));
}
}
次のように呼び出すと、出力は 11 になります。a1.m を呼び出すと、a2 と b1 が渡されます。
A クラスでは、am(b,b) が呼び出されたとき。動的タイプを呼び出します。一度パースすると動的型に変わるからでしょうか。では、anon クラスを使用できるようになりましたか?