舉例詳解Java中的訪問權(quán)限修飾符
訪問權(quán)限符:
(1)public:
對(duì)于成員來說:任何其他類都可以訪問它們,不管在同一個(gè)包中還是在另外的包中。
對(duì)于類來說: 也是一樣。
(2)friendly:
對(duì)于成員老說:如果一個(gè)類的成員沒有任何權(quán)限修飾,那么它門就是缺省包訪問權(quán)限,用friendly來表示,注
意friendly不是Java中的關(guān)鍵字,這里是個(gè)人喜歡的方式用它表示而已。同一個(gè)包內(nèi)其它類可以訪問,但包外
就不可以。對(duì)于同一個(gè)文件夾下的、沒有用package的classes,Java會(huì)自動(dòng)將這些classes初見為隸屬于該目錄
的default package,可以相互調(diào)用class中的friendly成員。如以下兩個(gè)class分別在同一個(gè)文件夾的兩個(gè)文件
中,雖然沒有引入package,但隸屬于相同的default package。
class Sundae{ //以下兩個(gè)方法缺省為friendly Sundae(){} Void f() {System.out.println(“Sundae.f()”); } public class IceCream{ public static void main(String[] args){ Sundae x = new Sundae(); x.f(); } }
對(duì)于類來說:同一個(gè)包中的類可以用??傊?,類只可以聲明為public或者friendly。
(3)private:
對(duì)于對(duì)于成員來說:只能在該成員隸屬于的類中訪問。
class Sundae{ private Sundae(){}//只能在Sundae class中被調(diào)用 Sundae(int i) {} static Sundae makASundae() { return new Sundae(); } } public class IceCream{ public static void main(String[] args){ // Sundae class中構(gòu)造函數(shù)Sundae()是private, // 所以不能用它進(jìn)行初始化 //Sundae x = new Sundae(); Sundae y = new Sundae(1);//Sundae(int)是friendly,可以在此調(diào)用 Sundae z = Sundae.makASundae(); } }
對(duì)于類來說:類不可以聲明為private。
(4)protected:
對(duì)于對(duì)于成員來說:相同包中的類可以訪問(包訪問權(quán)限);基類通過protected把基類中的成員的訪問權(quán)限賦予派生類不是所有類(派生類訪問權(quán)限)。
(5)default(默認(rèn)權(quán)限)
類,數(shù)據(jù)成員,構(gòu)造方法,方法成員,都能夠使用默認(rèn)權(quán)限,即不寫任何關(guān)鍵字。默認(rèn)權(quán)限即同包權(quán)限,同包權(quán)限的元素只能在定義它們的類中,以及同包的類中被調(diào)用。
例子:package c05.local;
import pack1.Cookie; //注意:在這里ChocolateChip繼承了類Cookie,按道理bite()方法也在 //ChocolateChip中,可以用x.bite直接調(diào)用,但是不可以的,因?yàn)轭怌hocolateChip //和Cookie類不在一個(gè)包中,各自具有包訪問權(quán)限,為了能夠使用x.bite()必須要把 //Cookie方法的訪問權(quán)限換成public或者protected,但是一旦換成public所有的人就 //可以訪問了,這樣達(dá)不到隱私的要求,所以設(shè)置成protected最好,既可以順利訪問,也可以 //避免外面的類調(diào)用,保護(hù)好隱私的作用 public class ChocolateChip extends Cookie { public ChocolateChip() { System.out.println("ChocolateChip constructor"); } public static void main(String[] args) { ChocolateChip x = new ChocolateChip(); x.bite(); // Can't access bite } } ///:~
package pack1; public class Cookie { public Cookie() { System.out.println("Cookie constructor"); } protected void bite(){System.out.println("bite");} }
對(duì)于類來說:類不可以聲明為protected
對(duì)于類的權(quán)限修飾,下面有更好的解釋:
Class類的訪問權(quán)限:
public:可以供所有的類訪問。
默認(rèn):默認(rèn)可以稱為friendly但是,java語言中是沒有friendly這個(gè)修飾符的,這樣稱呼應(yīng)該是來源于c++。默認(rèn)的訪問權(quán)限是包級(jí)訪問權(quán)限。
即如果寫了一個(gè)類沒有寫訪問權(quán)限修飾符,那么就是默認(rèn)的訪問權(quán)限,同一個(gè)包下的類都可以訪問到,即使可以實(shí)例化該類
(當(dāng)然如果這個(gè)類不具有實(shí)例化的能力除外,比如該類沒有提供public的構(gòu)造函數(shù))。
說明:
1、每個(gè)編譯單元(類文件)都僅能有一個(gè)public class
2、public class的名稱(包含大小寫)必須和其類文件同名。
3、一個(gè)類文件(*.java)中可以不存在public class。
這種形式的存在的場(chǎng)景:如果我們?cè)谀硞€(gè)包內(nèi)撰寫一個(gè)class,僅僅是為了配合同包內(nèi)的其他類工作,而且
我們不想再為了撰寫說明文檔給客戶(不一定是現(xiàn)實(shí)意義的客戶,可能是調(diào)用這個(gè)類的類)看而傷腦筋,而且有可能過一段時(shí)間之后
有可能會(huì)徹底改變?cè)械淖龇?,并完全舍棄舊版本,以全新的版本代替。
4、class不可以是private和protected。
5、如果不希望那個(gè)任何產(chǎn)生某個(gè)class的對(duì)象,可以將該類得所有構(gòu)造函數(shù)設(shè)置成private。但是即使這樣也可以生成該類的對(duì)象,就是class的static的成員(屬性和方法)可以辦到。
綜合示例:
First.java:
package Number; import Test.*; public class Frist extends Test { protected String s1 = "你好"; public static void main( String[] args) { String s2 = "java"; //System.out.println(s1); System.out.println(s2); Frist t = new Frist(); System.out.println(t.s); t.show(); return; } } Test.java: package Test; public class Test { protected String s = "hello test"; //可以被同包中的類訪問以及子類訪問,該子類可以是與包Test不同 public void show() { Test1 t1 = new Test1(); return; } } class Test1 { Test1() { Test t = new Test(); System.out.println(t.s); } }
輸出:
java hello test hello test
- Redis五種數(shù)據(jù)結(jié)構(gòu)在JAVA中如何封裝使用
- java實(shí)現(xiàn)兩個(gè)對(duì)象之間傳值及簡(jiǎn)單的封裝
- java 方法重寫與權(quán)限修飾符以及多態(tài)和抽象類詳解概念和用法
- Java中的權(quán)限修飾符(protected)示例詳解
- Java四種權(quán)限修飾符知識(shí)點(diǎn)詳解
- Java import導(dǎo)入及訪問控制權(quán)限修飾符原理解析
- 淺析java修飾符訪問權(quán)限(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)
- java封裝及四種權(quán)限修飾符詳解
相關(guān)文章
設(shè)計(jì)模式之模版方法模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了設(shè)計(jì)模式之模版方法模式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08Java替換int數(shù)組中重復(fù)數(shù)據(jù)的方法示例
這篇文章主要介紹了Java替換int數(shù)組中重復(fù)數(shù)據(jù)的方法,涉及java針對(duì)數(shù)組的遍歷、轉(zhuǎn)換、判斷等相關(guān)操作技巧,需要的朋友可以參考下2017-06-06java編程實(shí)現(xiàn)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲示例過程
這篇文章主要為大家介紹了如何使用java編程實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10Maven入門之使用Nexus搭建Maven私服及上傳下載jar包
這篇文章主要介紹了Maven入門之使用Nexus搭建Maven私服及上傳下載jar包,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12Java創(chuàng)建數(shù)組的幾種方式總結(jié)
下面小編就為大家?guī)硪黄狫ava創(chuàng)建數(shù)組的幾種方式總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10Spring?Boot自動(dòng)配置的原理及@Conditional條件注解
這篇文章主要介紹了Spring?Boot自動(dòng)配置的原理及@Conditional條件注解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的朋友可以參考一下2022-07-07使用Java將字符串在ISO-8859-1和UTF-8之間相互轉(zhuǎn)換
大家都知道在一些情況下,我們需要特殊的編碼格式,如:UTF-8,但是系統(tǒng)默認(rèn)的編碼為ISO-8859-1,遇到這個(gè)問題,該如何對(duì)字符串進(jìn)行兩個(gè)編碼的轉(zhuǎn)換呢,下面小編給大家分享下java中如何在ISO-8859-1和UTF-8之間相互轉(zhuǎn)換,感興趣的朋友一起看看吧2021-12-12