Java 有四個(gè)訪問(wèn)權(quán)限修飾符,分別是public protected default private
。這些修飾符用來(lái)修飾類辫诅、屬性和方法,一共也就這三種情況涧狮。建議在閱讀以下內(nèi)容時(shí)炕矮,配合 IDE 工具的智能提示進(jìn)行驗(yàn)證。
疑問(wèn):為什么要有訪問(wèn)控制權(quán)限這種東西者冤,它能用來(lái)干嘛肤视?給個(gè)保證安全性的解釋就完了?涉枫?邢滑?難道這樣解釋還不夠嗎?
用來(lái)修飾類
- public 修飾的類愿汰,表示完全公有的困后。只要是這個(gè)項(xiàng)目下乐纸,任何地方的類中都可以使用它,如果在不同包下摇予,使用 import 導(dǎo)入下即可汽绢。
- protected 不可以用來(lái)修飾外部類,但是在一個(gè)類的內(nèi)部類是可以使用 protected 修飾的侧戴,內(nèi)部類是外部類的一個(gè)組成部分宁昭,同樣可以被它的子類繼承。這里新增加的補(bǔ)充內(nèi)容啟示酗宋,筆記應(yīng)該反復(fù)查看积仗,曾經(jīng)的筆記可能有錯(cuò)誤或者不完善,后續(xù)應(yīng)該不斷的修改蜕猫,這就是寫(xiě)電子檔筆記的好處寂曹。
- default 修飾的類,表示在同一個(gè)包下的類中都可以使用丹锹,但是其他包下的類中無(wú)法使用它稀颁,因?yàn)楦揪鸵?jiàn)不到。
- private 修飾的類楣黍,叫做私有類匾灶,只有在本類中才可見(jiàn),其他類無(wú)法使用租漂。
用來(lái)修飾屬性
這里講的是實(shí)例屬性阶女,實(shí)例屬性只能通過(guò)對(duì)象引用才能夠使用。
- public 修飾的屬性哩治,表示在這個(gè)項(xiàng)目下秃踩,任何地方的類中只要持有這個(gè)類對(duì)象的引用就可以使用它。前提當(dāng)然是這個(gè)類能夠訪問(wèn)到對(duì)象所屬的類业筏,不然怎么可能持有這個(gè)對(duì)象的引用呢憔杨?其他同理!
- protected 修飾的屬性蒜胖,在同一個(gè)包下消别,任何一個(gè)類中只要持有這個(gè)類的引用就能夠使用它。不同包下台谢,即便是繼承關(guān)系也無(wú)法通過(guò)這個(gè)類對(duì)象的引用使用這個(gè)屬性寻狂。但是如果是繼承關(guān)系,那么這個(gè)類中可以通過(guò) this 指針來(lái)使用這個(gè)屬性朋沮,這是因?yàn)樽宇惱^承了父類的屬性蛇券。這是兩個(gè)完全不同的概念,不沖突。
- default 修飾的屬性纠亚,在同一個(gè)包下塘慕,任何一個(gè)類中只要持有這個(gè)對(duì)象的引用就可以訪問(wèn)它,不同包下盡管持有這個(gè)對(duì)象的引用也無(wú)法使用這個(gè)屬性菜枷,而且即便是繼承關(guān)系也無(wú)法通過(guò) this 指針使用它苍糠。
- private 修飾的屬性叁丧,只能在本類中使用啤誊,其他類都無(wú)法使用到。
用來(lái)修飾方法
這里講的是實(shí)例方法拥娄,實(shí)例方法只能通過(guò)對(duì)象引用才能夠使用蚊锹。
- public 修飾的方法,表示在這個(gè)項(xiàng)目下稚瘾,任何一個(gè)類中只要持有這個(gè)類對(duì)象的引用就可以使用這個(gè)方法牡昆。
- protected 修飾的方法,在同一個(gè)包下摊欠,任何一個(gè)類中只要持有這個(gè)類對(duì)象的引用來(lái)使用它丢烘。但是在不同包下,即使是繼承關(guān)系也無(wú)法通過(guò)這個(gè)類對(duì)象的引用使用它些椒。但是在這個(gè)類中可以通過(guò) this 指針使用這個(gè)方法播瞳,這是因?yàn)樽宇惱^承了父類的方法。對(duì)于 JDK 中提供的類也是同樣成立的免糕,廢話赢乓,JDK 提供的類就能夠特殊對(duì)待嗎?比如 Object 類有一個(gè)
protected void finalize()throws Throwable
方法就是 protected 修飾的石窑,任何對(duì)象都是無(wú)法通過(guò)引用來(lái)調(diào)用這個(gè)方法的牌芋,只能在類的內(nèi)部通過(guò) this 指針調(diào)用。 - default 修飾的方法松逊,在同一個(gè)包下躺屁,任何一個(gè)類中只要持有這個(gè)類對(duì)象的引用就可以使用它。在不同包下经宏,即使是繼承關(guān)系也無(wú)法通過(guò)這個(gè)類對(duì)象的引用使用它犀暑。而且即便是繼承關(guān)系也無(wú)法通過(guò) this 指針使用它,但是同一個(gè)包下的繼承關(guān)系還是可以通過(guò) this 指針使用它的烛恤。這說(shuō)明是因?yàn)椴煌聦?dǎo)致訪問(wèn)權(quán)限的問(wèn)題母怜,而不是不同包下就繼承不到了。
- private 修飾的方法缚柏,只能在本類中使用苹熏,其他類中都無(wú)法使用到。
總結(jié):
實(shí)例屬性、實(shí)例方法都是依賴于具體對(duì)象的轨域,所以不能脫離對(duì)象來(lái)談訪問(wèn)權(quán)限袱耽。Java 中任何代碼都是在類中的,所以也不能脫離類來(lái)談訪問(wèn)權(quán)限干发。因此朱巨,在談?wù)撛L問(wèn)權(quán)限的過(guò)程中,首先要明確是在哪個(gè)類中枉长,其次要明確這是通過(guò)類對(duì)象的引用來(lái)使用的方法或?qū)傩浴?/p>
包真的是一個(gè)分水嶺啊冀续。同一個(gè)包下無(wú)論是 protected 還是 default 都可以通過(guò)類對(duì)象的引用訪問(wèn)屬性和方法,但是在不同的包下是不可能訪問(wèn)得到的必峰。而且洪唐,對(duì)于繼承也是如此,同一個(gè)包下子類可以通過(guò) this 就能夠訪問(wèn)到protected 和 default 修飾的屬性和方法吼蚁,但是在不同包下凭需,子類只能訪問(wèn)到 protected 修飾的屬性和方法,default 修飾的也不行肝匆。
public 和 private 都沒(méi)有問(wèn)題粒蜈,很清晰明了。唯獨(dú) protected 和 default 修飾的屬性和方法有點(diǎn)繞旗国,以前好像一直沒(méi)深究過(guò)這個(gè)問(wèn)題枯怖,這塊都不清楚。這次弄清楚了粗仓,也不知道什么時(shí)候會(huì)忘記嫁怀,什么時(shí)候又能夠用得上呢。
正常情況下借浊,大部分都是采用 public 和 private 配合使用塘淑,default 和 protected 用的好像并不多誒,以后慢慢積累它的使用場(chǎng)景蚂斤。