
| private | default | protected | public | |
|---|---|---|---|---|
| 同一個(gè)類中 | √ | √ | √ | √ |
| 同一個(gè)包中 | √ | √ | √ | |
| 子類中 | √ | √ | ||
| 全局范圍內(nèi) | √ |
<p align = "center"> 我知道,你肯定看過(guò)這表格很多次了 </p>
<p align = "center"> 因?yàn)槲乙彩沁@樣,然而……</p>
<p align = "center"> 不知道為啥并沒(méi)有記住</p>
<p align = "center"> 當(dāng)有人問(wèn)我的時(shí)候</p>
<p align = "center"> 我突然還是一片空白……</p>
<p align = "center"> 我也很無(wú)奈啊</p>
<p align = "center"> 打好基礎(chǔ)</h6>
<p align = "center"> 人人有責(zé)</h6>
-
private
當(dāng)前類訪問(wèn)權(quán)限:如果類里的一個(gè)成員(包括Field、方法和構(gòu)造器等)使用private來(lái)修飾,則這個(gè)成員只能在當(dāng)前類的內(nèi)部被訪問(wèn)。
-
default
包訪問(wèn)權(quán)限:類里的一個(gè)成員(包括Field、方法和構(gòu)造器等)或者一個(gè)外部類不使用任何訪問(wèn)控制符修飾。default訪問(wèn)控制的成員或外部類可以被相同包下的其他類訪問(wèn)。
-
protected
子類訪問(wèn)權(quán)限:如果一個(gè)成員(包括Field、方法和構(gòu)造器等)使用protected訪問(wèn)控制符修飾,那么這個(gè)成員既可以被同一個(gè)包中的其他類訪問(wèn),也可以被不同包中的子類訪問(wèn)。
通常情況下,如果使用protected來(lái)修飾一個(gè)方法,通常是希望子類來(lái)重寫(xiě)這個(gè)方法。
-
public
公共訪問(wèn)權(quán)限:類里的一個(gè)成員(包括Field、方法和構(gòu)造器等)或者一個(gè)外部類使用public任何訪問(wèn)控制符修飾,那么這個(gè)成員或外部類就可以被所有類訪問(wèn),不管訪問(wèn)類和被訪問(wèn)的類是否處于同一個(gè)包,是否具有繼承關(guān)系。
<p align = "center"> 不知道大家能不能分得清</p>
<p align = "center"> 我總是記不清default和protected</p>
<p align = "center"> 還是我理解的不到位</p>
<p align = "center"> 再次重申</p>
<p align = "center"> 打好基礎(chǔ)</p>
<p align = "center"> 人人有責(zé)

default:同一包下可訪問(wèn)
protected:同一包和所有子類可訪問(wèn)
<h2 align = "center">那么,再來(lái)一次</h2>
| 修飾符 | 說(shuō)明 |
|---|---|
| private | 私有的,在同一類內(nèi)可見(jiàn)。 |
| default | 在同一包(包括子類和非子類)內(nèi)可見(jiàn)。 |
| protected | 受保護(hù)的,對(duì)同一包內(nèi)的類和所有子類可見(jiàn)。 |
| public | 公有的,對(duì)所有類可見(jiàn)。 |
- 這里的可見(jiàn)、可訪問(wèn)指的是能不能通過(guò)** ”類的對(duì)象.變量名“**的方式訪問(wèn),這是因?yàn)槌齭tatic聲明的變量屬于類變量外,其他的都屬于實(shí)例變量,是屬于某個(gè)對(duì)象的。
Person p = new Person(); p.age直接訪問(wèn)age變量,對(duì)于那些私有的變量,很多情況下會(huì)對(duì)外提供public的setter和getter方法來(lái)供外部訪問(wèn)。
- 要注意的是,對(duì)于有繼承關(guān)系的子類來(lái)說(shuō),比如 class A extends B,A直接繼承擁有了默認(rèn)的(在同一包下)、protected、public的這個(gè)字段,可以直接使用該字段,而不用通過(guò)再次的實(shí)例化父類或"父類對(duì)象.字段"的形式訪問(wèn),因?yàn)樵趯?shí)例化A類的時(shí)候父類B已經(jīng)實(shí)例化好了。特別的,對(duì)于protected來(lái)說(shuō),如下形式是編譯不能通過(guò)的。
// 注意包
package com.a;
public class A extends B{
public void test(){
B b = new B();
String str = b.age; // 錯(cuò)!不同包下的子類不能通過(guò)實(shí)例出來(lái)的父類獲取protected的變量
String str2 = age; // 正確,A類繼承了B,直接擁有了該字段
String str3 = b.birthday; // 正確,birthday為public
}
}
// 注意包
package com.b
public class B{
protected String age = "20";
public String birthday = "1995";
}
結(jié)論
- 在訪問(wèn)控制符的約束前提下
- 對(duì)于非繼承類關(guān)系:使用 “實(shí)例變量.變量名的形式訪問(wèn)”(static類變量除外)
- 對(duì)于有繼承關(guān)系的子類:子類直接繼承了擁有了默認(rèn)的(在同一包下)、protected、public的這個(gè)字段,可以直接使用該字段。
<h2 align = "center">打好基礎(chǔ),人人有責(zé)</h2>
看書(shū)的時(shí)候細(xì)致一點(diǎn)啊,表像我一樣囫圇吞棗啊,一定要充分理解再往下進(jìn)行。不然越到后面越覺(jué)得懷疑人生有木有,留意點(diǎn)點(diǎn)滴滴。
