重点保护
在“ Java的一些句子 ”一文中,我寫道: “受保護的方法和字段可以在同一包中的類中使用(到目前為止與私有包相同),此外,還可以從其他類中使用受保護的方法和字段,這些類擴展了包含受保護的字段或方法。”
盡管以上陳述是正確的,但它可能無法揭示全部事實,我認為這值得一新。
當您在一個類中有一個專用X(方法,字段,類,接口,構造函數)時,可以從頂級類中使用該X。 如前一篇文章所述,使用意味著可以在實例“ this ”中訪問X,而在其他實例中,只要代碼訪問與X在同一頂級類中,就可以訪問X。
如果刪除X前面的private關鍵字,則將可見性擴展到程序包級別。 您可以在包中使用X,就像在私有的類中使用X之前一樣。
如果我們再走一步,并在X的前面插入關鍵字protected ,它將在擴展了聲明X的類的類中可見,但無法從該類內部以私有X或從內部打包private的方式訪問同一方式。相同的包裝。 由于protected擴展了私有包對X的可見性,因此,仍然可以以相同的方式在包內使用受保護的X,但在包外不能以相同的方式使用。
不同之處在于,您只能在擴展X功能的代碼中訪問受保護的X。
以上不是精確的定義。 我在此博客中多次引用的Java語言規范在6.6.2章中對此進行了詳細說明。 精確,完整,但閱讀起來可能不容易或有趣,這對本文也可能是正確的,但是由于您正在閱讀,所以我認為您覺得它很有趣,很有教育意義,或者您有一些非常特定的原因來閱讀它。
當您與聲明X的類位于同一包中時,可以在其他實例上訪問X。 我們可以有一些簡單的類來演示這一點。 首先,我們可以有一個擴展的根類:
package a; public class A {protected void protectedMethod(A a) { } }我們有類“ B”,它擴展了“ A”,并且在同一包中。
package a; import a.A; public class B extends A {@Overrideprotected void protectedMethod(A a) {a.protectedMethod(this);super.protectedMethod(this);} }如果我們將類“ B”移動/復制到另一個包,例如:
package b; import a.A; public class B extends A {@Overrideprotected void protectedMethod(A a) {a.protectedMethod(this);super.protectedMethod(this);} }那么第6行將無法編譯。 在前一個程序包中時,編譯器允許它訪問該方法,因為程序包保護使其成為可能。 無論在什么實現實例中,方法的參數“ a”都在同一包中。 在“ b.B”類的情況下,程序包保護不允許訪問,并且因為我們存儲在方法參數“ a”中的實際對象實例可能是“ b.B”未擴展的類的實例,因此無法訪問它。 它可以是該類示例的實例:
package c; import a.A; public class C extends A { }您可以做的是:
- 覆蓋子類中的方法或
- 使用關鍵字super調用父方法。
通常,這實際上是您可以使用其程序包外部的受保護方法來做的所有事情。
翻譯自: https://www.javacodegeeks.com/2015/01/fine-points-of-protection.html
總結
- 上一篇: 建立代理,而不是框架
- 下一篇: 安卓APP开发公司发财了(安卓app开发