2013-11-22 23 views
-2

假設您有一個擴展父類A的類B.要訪問B的方法,您可以使用它。要訪問A,你可以使用super。如果你有一個擴展B類的第三類C,你可以使用它來訪問C的方法,並使用超類來訪問B.如何從C類訪問A的方法?超級與這對於三個類

+4

這可能有助於 http://stackoverflow.com/questions/586363/why-is-super-super-method-not-allowed-in-java –

+0

你不需要調用超級如果你不是壓倒一切。你需要給出一個更好的解釋。 –

+0

「你會使用它來訪問C的方法,並且超級訪問B」這是根本錯誤的。 'super'可用於訪問代碼所在類的超類中的方法實現。因此,在類B中訪問具有'super'的方法將訪問類A中的方法(或其超類),即使當前對象具有C類(或其子類)。 'super'是一種完全不同的方法訪問方式。 – newacct

回答

0

你其實不會因爲它會違反封裝原則。 但是,您可以在B類中創建一個與A相同的方法並獲得所需的結果。

0

讓我們用這個例子:

class Bird { 
    public final void eat() { 
     //... 
    } 
    public boolean canFly() { 
     return true; 
    } 
} 

class FlightlessBird extends Bird { 
    public boolean canFly() { 
     return false; 
    } 
} 

class Ostrich extends FlightlessBird { 
    public void takeoff() { 
     if (canFly()) { 
      //.... 
     } 
    } 
} 

鴕鳥延伸FlightlessBird所以canFly()將始終返回false。如果可以的話,無論如何撥打super.super.canFly()你最終會得到一隻飛行的鴕鳥,這是任何人都不想看到的。基本上,方法由於某種原因被重寫,並且可能導致災難性結果。如果你在所有的孩子類中都需要一個方法,那麼將它標記爲final,這樣它就不能被覆蓋(就像上面的例子中吃的那樣)。如果您使用的是其他人的圖書館,並且您無法更改祖父母,那麼您需要直接從祖父母繼承。另外,如果你發現自己需要使用超級超級,那麼你可能做錯了什麼。