首頁 > Java > java教程 > 主體

舉例詳解Java中的存取權限修飾符

高洛峰
發布: 2017-01-24 15:36:29
原創
2286 人瀏覽過

存取權限符:
(1)public:
對於成員來說:任何其他類別都可以存取它們,不管在同一個套件中還是在另外的套件中。
對於類別:    也是一樣。
(2)friendly:
對於成員老說:如果一個類別的成員沒有任何權限修飾,那麼它門就是缺省包訪問權限,用friendly來表示,註

意friendly不是Java中的關鍵字,這裡是個人喜歡的方式用它表示而已。同一個包內其它類可以訪問,但包外

就不可以。同一個資料夾下的、沒有用package的classes,Java會自動將這些classes初見為隸屬於該目錄

的default package,可以互相呼叫class中的friendly成員。如以下兩個class分別在同一個資料夾的兩個檔案

中,雖然沒有引入package,但隸屬於相同的default package。

class Sundae{
//以下两个方法缺省为friendly
Sundae(){}
Void f() {System.out.println(“Sundae.f()”);
}
public class IceCream{
public static void main(String[] args){
Sundae x = new Sundae();
x.f();
}
}
登入後複製

對於類別:同一個套件中的類別可以用。總之,類別只可以宣告為public或friendly。
(3)private:
對於對成員來說:只能在該成員隸屬於的類別中存取。

class Sundae{
   private Sundae(){}//只能在Sundae class中被调用
   Sundae(int i) {}
   static Sundae makASundae() {
   return new Sundae();
   }
   }
   public class IceCream{
   public static void main(String[] args){
   // Sundae class中构造函数Sundae()是private,
   // 所以不能用它进行初始化
   //Sundae x = new Sundae();
   Sundae y = new Sundae(1);//Sundae(int)是friendly,可以在此调用
   Sundae z = Sundae.makASundae();
   }
   }
登入後複製

對於類別:類別不可以宣告為private。

(4)protected:
對於對於成員來說:相同包中的類別可以存取(包訪問權限);基類透過protected把基類中的成員的訪問權限賦予派生類不是所有類(派生類訪問權限)。

(5)default(預設權限)
  類,資料成員,建構方法,方法成員,都能夠使用預設權限,即不寫任何關鍵字。預設權限即同包權限,同包權限的元素只能在定義它們的類別中,以及同包的類別中被呼叫。

範例:package c05.local;

import pack1.Cookie;
//注意:在这里ChocolateChip继承了类Cookie,按道理bite()方法也在
//ChocolateChip中,可以用x.bite直接调用,但是不可以的,因为类ChocolateChip
//和Cookie类不在一个包中,各自具有包访问权限,为了能够使用x.bite()必须要把
//Cookie方法的访问权限换成public或者protected,但是一旦换成public所有的人就
//可以访问了,这样达不到隐私的要求,所以设置成protected最好,既可以顺利访问,也可以
//避免外面的类调用,保护好隐私的作用
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");}
 
}
登入後複製

  

對類別:類不可以宣告protected 

對於類別的權限修飾,以下有更好的解釋:

類的存取權

:可以供所有的類別存取。
預設:預設可以稱為friendly但是,java語言中是沒有friendly這個修飾符的,這樣稱呼應該是來自c++。預設的存取權限是包級存取權限。
         也就是如果寫了一個類別沒有寫入存取權限修飾符,那麼就是預設的存取權限,同一個套件下的類別都可以存取到,即使可以實例化該類別
        (當然如果這個類別不具有實例化的能力除外,例如該類別沒有提供public的建構子)。

說明:

       1.每個編譯單元(類別檔案)僅能有一個public class
       2、public class的名稱(包含大小寫)必須與其類別檔案同名。
       3、一個類別檔案(*.java)中可以不存在public class。
        這種形式的存在的場景:如果我們在某個包內撰寫一個class,僅僅是為了配合約包內的其他類工作,而且
       我們不想再為了撰寫說明文檔給客戶(不一定是現實意義的客戶,可能是調用這個類別的類別)看而傷腦筋,而且有可能過一段時間之後
       有可能會徹底改變原有的做法,並完全捨棄舊版本,以全新的版本代替。
       4、class不可以是private和protected。
       5、如果不希望那個任何產生某個class的對象,可以將該類別得所有構造函數設定成private。但即使這樣也可以產生該類別的對象,就是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
登入後複製
更多舉例詳解Java中的存取權限修飾符相關文章請關注PHP網網相關文章!


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!