2012-02-15 78 views
2

在我看來,當你重寫方法時,你打算修改它們的用處。
但是,爲什麼在超類中引用相同的方法(以它最初寫入的方式),如果它不像我那樣感興趣?也就是說,修改方法,然後以原始方式調用相同的方法,在我看來,第一個更改被第二個更改取消。我錯在哪裏?@Override and Super

回答

2

你不一定調用.super()爲了調用派生你的類的超類中的方法。然而,你經常這樣做,因爲你在重寫方法中做的東西應該被加上來完成超類方法執行的東西。無論您是否執行此操作取決於相關代碼的設計。

某些Android API方法絕對要求您在覆蓋它們時調用.super(),因爲有一些重要的東西是超類的方法最重要的,即使派生類重寫了該方法。如果您在覆蓋Android API方法時必須致電.super(),文檔通常會這樣說。如果你不這樣做,你可能會得到一個異常,特別是在執行代碼時告訴你不這樣做。

+0

我只是想知道,相應的類如何檢查超級被調用 - 如果它不是拋出異常? – Force 2012-02-15 11:05:16

+0

我想這樣做的一種方法可能與實現在超類的方法(派生類可以重寫)中設置的標誌'boolean'一樣簡單,並在另一個方法中輪詢該標誌,並在未設置時拋出異常。例如,通過這種方式,您可以檢測是否調用了「doSomeStuff()」,而未調用基類「initialiseStuffFirst()」。 – Trevor 2012-02-15 11:11:28

+0

android'Activity'類有一些方法示例,如果您覆蓋它們,您必須調用'.super()' - 可能值得查看Grepcode上的源代碼以查看它們如何檢測它。 – Trevor 2012-02-15 11:13:28

4

除了Trevor之外,大多數需要你調用super()的方法意味着你正在重寫的方法對於流程生命週期的順利進行是必要的(如在Activity的onCreate,onPause等)。如果你未能在這些方法上返回超級,android會抱怨。另一方面,調用super的其他重寫方法(在擴展Android類(例如View)時可以看到它們)實際上會返回某些內容(很可能是true或false) - 如某些return super.methodName(args); - 根據情況而定,你可以重寫這些,直到你可以手動返回一個值並跳過超級通話。

+0

非常好的解釋。 – 2012-02-15 11:56:35