2015-02-06 57 views
0

我正在學習Java,我正在做這個練習,我不得不說說主要的方法打印什麼。其目標是更好地理解Java繼承。基本的Java繼承練習

interface X extends Remote{ 
    A m(B bb) throws RemoteException; 
} 

class A implements Serializable{ 
    int a; 
    A m(A aa){ 
     aa.a = 3; 
     System.out.println("A.m"); 
     return aa; 
    } 
} 

class B extends A{ 
    int b; 
    A m(B bb){ 
     bb.b = 7; 
     System.out.println("B.m"); 
     return bb; 
    } 
} 

class C extends A implements X{ 
    public B m(B bb){ 
     if(bb.b == 7) bb.b = 9; else bb.b = 1; 
     System.out.println("C.m"); 
     return bb; 
    } 
} 

現在我有我稱之爲一個主要方法:

X x = new C(); 
B b = new B(); 
(x.m(b)).m(b); // prints C.m() A.m() 

我的主要方法,版畫「CM()上午()」的第三行,但我不明白爲什麼它打印Am()。 x.m(b)返回一個同時具有靜態和動態類型== B的對象;在這個對象上它被調用m(b)方法;那麼爲什麼它不被稱爲B類的m()方法?

我已經看到,B類中的m()方法不是A類中m()方法的重寫,因爲它們具有不同的顯式參數。

感謝在的B一個實例,其延伸A預先

+4

我會避免將事物命名爲A,a,aa,m(A aa),a.m,aa.a.它只是使代碼更難閱讀。 – 2015-02-06 15:24:55

+0

你是對的,我完全同意你的看法。這是一本書的練習,只是探索繼承。任何想法爲什麼它打印C.m()A.m()而不是C.m()B.m()如我所想?感謝m8 – 2015-02-06 15:33:32

回答

5

b。因此,B有2 m方法。

要知道哪個被調用,重要的是調用該方法的對象的類型。

(x.m(b)) 

是呼叫從X接口m方法的結果,因爲x聲明類型是X

因此(x.m(b))是類型爲A的對象(儘管實際實現是B)。

這是一個類型A,調用A類的m方法。

如果更改方法的名稱,將會更清楚地知道從ABm方法是真正不同的對象。

你的錯誤是假設

的x.m(b)中返回具有靜態和動態類型== B中的對象;

哪項是錯誤的,因爲x聲明X型的,使得x.m類型A結果。

+0

另一個重要的觀點是,'B'' A m(B bb){'不覆蓋'A''中的方法A m(A aa){'因爲參數更具體,意味着它無法回答'A'中所有方法的調用。 (但我認爲你已經理解了那部分)。 – njzk2 2015-02-06 16:07:50