1.前提
對於Java外部類和內部類的概念不清楚的,可以自行去百度一下,了解一下。
2.Java的四種權限修飾符
private(私有的)無法訪問:使用private關鍵字,就意味着被聲明的成員或方法,除了本類,其他任何類都無法訪問。
public(公共的)接口訪問權限:使用public關鍵字,就意味着被聲明的成員或方法對所有類都是可以訪問的。
protected(受保護的)繼承訪問權限:使用protected關鍵字,就意味着被聲明的成員或方法,在子類以及相同包內的其他類都是可以訪問的。
default(默認的)包訪問權限:即不寫任何關鍵字,就意味着相同包內的其他類(包括子類)可以訪問,包外都不可以訪問。
修飾符 | 同類中 | 同一個包中(子類和無關類) | 不同包(子類) | 不同包(無關類) |
---|---|---|---|---|
public | ✔️ | ✔️ | ✔️ | ✔️ |
protected | ✔️ | ✔️ | ✔️ | ✘ |
default默認 | ✔️ | ✔️ | ✘ | ✘ |
private | ✔️ | ✘ | ✘ | ✘ |
3.為什么不能使用private、protected修飾外部類
為什么不能用private修飾Java外部類?
因為如果使用private修飾Java外部類,那么這個類不能創建實例,這個類的屬性和方法不能被訪問,那么創建這個類毫無意義,所以不能使用private修飾Java外部類。
為什么不能用protected修飾Java外部類?
舉個栗子,如果類A用protected修飾,與類A不同包的類B想要訪問類A的話,類B就必須是繼承類A的(或者說類B必須為類A的子類),但是類B繼承類A的前提又是類B可以訪問到類A,仔細想想會發現這里是沖突的,其實這就說明了為什么不能用protected來修飾外部類。再說,protected是用來表示在繼承關系中的訪問權限的,在同一個包和子類中都可以訪問,因為繼承就是為了擁有父類的屬性和方法,所以protected是用於修飾類的方法和屬性的,也就是說,我想要這個類的屬性和方法可以被任何子類繼承,我就用protected。我想要這個類的屬性和方法不能被任何子類繼承,我就用private。同理,我想要這個類被繼承,我就用abstract。我不想這個類被繼承,我就用final。所以,用protected修飾類有什么意義呢?關鍵點還是在於第一句話,protected是用來表示在繼承關系中的訪問權限的!