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));
}
}
問題是,下面的輸出是什麼。我的答案是正確的,但我沒有完全明白爲什麼。
由於B對象的內部類是(A,A)。我是否認爲它不能覆蓋超級方法m,因爲它是(A,B)?如果兩個方法的參數交換了,它能重寫嗎?
既然它既不能覆蓋也不能重載,它什麼也不做,只是使用B類中的方法m?
對象的內部類是否僅爲其自身工作?它是否像一個匿名課?
對所有問題表示歉意。
在此先感謝。
編輯:
從我的理解,到目前爲止,其因爲靜態類型設置爲B,那麼B型是無法看到匿名類。如果這是公開的,它可以被看到,但它仍然不會被使用。
這使我對另一個問題感到困惑。
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類中,當調用a.m(b,b)時。它調用動態類型。這是因爲它一旦解析就更改爲動態類型?那麼現在它能夠使用匿名類嗎?
回答如下,請告訴我,如果事情是模糊的。這是頗有些運動在這裏;) – fge