爲什麼編譯器在重寫子類時降低方法的可見性時會給出錯誤消息?爲什麼不能減少Java子類中方法的可見性?
41
A
回答
65
因爲子類的每個實例仍然需要是基類的有效實例(請參閱Liskov substitution principle)。
如果子類突然丟失了基類的一個屬性(例如公共方法),那麼它將不再是基類的有效替代品。
1
因爲子類型必須可用作其超類型的實例。
18
因爲如果這是允許的,下面的情況是可能的:
從類父類子繼承。 Parent有一個公共方法foo
,Sub使該方法變爲私有。現在,下面的代碼將編譯很好,因爲bar
聲明的類型是父:
Parent bar = new Sub();
bar.foo();
然而,目前尚不清楚這應該如何表現。一種可能性是讓它導致運行時錯誤。另一種方法是簡單地允許它,這樣就可以從外部調用一個私有方法,只需轉換到父類即可。這些替代方法都不可接受,所以不允許。
相關問題
- 1. 什麼可以減少MySqls的性能?
- 2. 爲什麼Java不允許減少父方法的可見性,但允許增加它們?
- 3. 我爲什麼不能減少的繼承靜態方法
- 4. 意義「不能減少繼承方法的可見性」與接口
- 5. 爲什麼模板化基類中的方法不可見?
- 6. 爲什麼不能在子類中看到父類的方法?
- 7. 的Java爲什麼這種方法不可見
- 8. 爲什麼我可以增加子類中重載方法的可見性,它不是安全風險嗎?
- 9. 哪個類不能成爲java中的子類,爲什麼?
- 10. 減少的Java方法
- 11. 爲什麼動態類型方法不可見?
- 12. 減少創建新列表的方法,爲什麼不定義?
- 13. 在Java中,爲什麼在父類和子類中聲明的變量在子類的實例中不可見?
- 14. 爲什麼參數的專用字段對Java 6中的泛型方法可見但對Java 7不可見?
- 15. 爲什麼不能Java請參見
- 16. 爲什麼不調用子類方法?
- 17. 什麼是減少幾何的複雜性的最好方法
- 18. Java中的類之間的方法可見性
- 19. 爲什麼受保護的方法不能從子類訪問?
- 20. 爲什麼跳過只能用於動態方法的可見性檢查?
- 21. 爲什麼這個語法沒有減少/減少衝突?
- 22. 子類可以影響虛擬方法的可見性嗎?
- 23. 爲什麼laravel 5.4看不見()方法
- 24. 減少分類方法中的類可以提高準確性嗎?
- 25. 爲什麼我不能在Swift中減少內部整數?
- 26. 爲什麼我不能在減少邏輯中引用鍵?
- 27. 爲什麼n減少?
- 28. 爲什麼多處理性能不可見?
- 29. 在ArrayList中的子對象的屬性和方法不可見
- 30. 爲什麼方法引用不能應用於子類?
但是,爲什麼我們不允許覆蓋受保護的方法並將其更改爲私有方法?由於公共接口仍然是相同的,所以它不會以這種方式破壞LSP。 – Pacerier 2014-08-23 07:32:40
公共接口不會改變,但受保護的。父類中的代碼不能訪問它自己的血肉和血液:( – Elazar 2015-09-07 22:08:30