3 回答

TA貢獻1843條經(jīng)驗 獲得超7個贊
您的問題有一個簡單的答案。在解決方案之后,我將說明每種情況下的輸出。在此之前,有關(guān)您的代碼段的一些注意事項:
隨著類的B擴展A,并且具有methodOne具有不同類型的parameter(Integer)的相同方法,它具有method的兩個重載版本methodOne。
A a = new B();這里a是B和類型的實例A。
理由:
a.methodOne(10):參數(shù)的類型10為int。這樣void methodOne(int i)的類A被調(diào)用。
a.methodOne(new Integer(10)):參數(shù)的類型new Integer(10)為,Integer但methodOne(Integer i)子類中的方法對者B不可見a。因此new Integer(10)取消裝箱int 10并再次調(diào)用void methodOne(int i)class A。
b.methodOne(20):作為b的實例B,它具有method的兩個版本methodOne。但是參數(shù)的類型10是int,因此又調(diào)用void methodOne(int i)了類A(其父類)。
解決方案:
B b = new B();
b.methodOne(new Integer(20));
此處,參數(shù)的類型20為Integer。因此void methodOne(Integer i),B將調(diào)用class的。
這是一個小實驗,可以幫助您了解父類中子類方法的不可見性。在類B中放置一個偽方法,并嘗試使用類型為的對象A但類型為的實例B進行訪問。以下是修改后的代碼。
// Place this method in Class B
void test(){
}
//In the main method
A a = new B();
// a.test();
// The test method will not be available in class `A`, though the instantation of `a` is of type `B`.

TA貢獻1883條經(jīng)驗 獲得超3個贊
該行為與自動裝箱和自動拆箱有關(guān)。有了這個線常見的兩種情況下,請注意,這個例子是不相關(guān)的方法覆蓋。
A a = new B();
a.methodOne(10); /* line 1 */
a.methodOne(new Integer(10)); /* line 2 */
B b = new B();
b.methodOne(20); /* line 3 */
b.methodOne(new Integer(20)); /* line 4 */
方案1:
class A {
void methodOne(Integer i) {
System.out.println("Integer " + i);
}
}
class B extends A {
void methodOne(int i) {
System.out.println("int " + i);
}
}
輸出
Integer 10 /* line 1, [AutoBoxing] */
Integer 10 /* line 2 */
int 20 /* line 3, B has method(int) */
Integer 20 /* line 4, B has method(Integer) */
方案2
class A {
void methodOne(int i) {
System.out.println("int " + i);
}
}
class B extends A {
void methodOne(Integer i) {
System.out.println("Integer " + i);
}
}
輸出
int 10 /* line 1 */
int 10 /* line 2, [auto unboxing] */
int 20 /* line 3 */
Integer 20 /* line 4 */

TA貢獻1812條經(jīng)驗 獲得超5個贊
class A {
void methodOne(Integer i) {
System.out.println("Integer " + i);
}
}
class B extends A {
void methodOne(int i) {
System.out.println("int " + i);
}
}
public class Solution {
public static void main(String[] args) {
A a = new B();
a.methodOne(10);
a.methodOne(10);
B b = new B();
b.methodOne(20);
}
}
添加回答
舉報