一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳解Java之路(五) 訪問權限控制

詳解Java之路(五) 訪問權限控制

2020-07-11 12:06songoo Java教程

本篇文章主要介紹了Java之路(五) 訪問權限控制 ,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。

Java中,所有事物都具有某種形式的訪問權限控制。

訪問權限的控制等級從最大到最小依次為:public,protected,包訪問權限(無關鍵詞)和private。

public,protected和private這幾個Java訪問權限修飾詞在使用時,是置于類中每個成員(域或者方法)定義之前的。

一、類成員的訪問權限

取得對某成員的訪問權的唯一途徑是:

  1).使該成員成為public。無論誰在哪里,都可以訪問該成員;

  2).通過不加訪問權限的修飾詞并將其他類放置于同一包內的方式給成員賦予包訪問權限,包內的其他類可以訪問該成員;

  3).繼承而來的類既可以訪問public成員也可以訪問protected成員。

  4).提供訪問器和變異器方法,以讀取和改變數值。

1.包訪問權限

默認訪問權限沒有任何關鍵字,但通過是指包訪問權限,這表示當前報中的所有其他類都對那個成員有訪問權限,但是對于這個包之外的所有類,這個成員確是private。

包訪問權限將包內所有相關的類組合起來,以使它們彼此之間可以輕松地相互作用。

注意:如果兩個類處于相同的目錄下,并且沒有給自己設定任何包名稱,Java會將這樣的文件自動看作是隸屬于該目錄的默認包之中,于是這些文件互相之間有包訪問權限。

下面的例子說明了這個問題:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//類Cake和Pie處于同一目錄下,沒有明確的顯示在任何包中
 
class Pie{
  void f(){
    System.out.println("Pie.f()");
  }
}
 
class Cake{
  public static void main(String[] args){
     Pie x = new Pie();
     x.f();
   }
}
 
//輸出為Pie.f()

2.public:接口訪問權限

使用關鍵字public,就意味著其后的成員聲明對所有人可用,特別是使用類庫的客戶程序員也是如此。

3.private:你無法訪問

關鍵字private表示出了包含該成員的類之外,其他任何類都無法訪問這個成員。同一包內的其他類不可以訪問這個類的private成員,因此這相當于自己隔離了自己。

private關鍵字的這種作用有許多用途,比如,控制如何創建對象,阻止別人直接訪問某個特定的構造器(或全部構造器)。看

下面的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
class Sundae{
  private Sundae(){}
  static Sundae makeASundae(){
    return new Sundae();
  }
}
 
public class IceCream {
  public static void main(String[] args){
    Sundae x = Sundae.makeASundae();
  }
}

這個例子里,我們可以通過調用makeASundae()方法來創建Sundae對象,但是不能通過構造器來創建。

這對于類中的private域同樣適用。

但是要注意一點,不能因為在類中某個對象的引用是private,就認為其他的對象無法擁有該對象的public引用。

4.protected:繼承訪問權限

如果創建了一個新包,并自另一個包繼承類,那么唯一可以訪問的成員就是源包的public成員。

有時,基類的創建者希望將某個特定成員的訪問權限賦予派生類而非所有類,這就需要使用關鍵字protected來實現。

注意,protected也提供包訪問權限,即相同包內的其他類也可以訪問此類的protected元素。

二、接口和實現

訪問權限的控制通常被稱為具體實現的隱藏。

把數據和方法包裝進類中,以及具體實現的隱藏,常共同被稱作是封裝。

出于兩個重要的原因,訪問權限控制將權限的邊界劃在了數據類型的內部:

1.要設定客戶端程序員可以使用和不可以使用的界限。可以在結構中建立自己的內部機制,兒不必擔心客戶端程序員會偶然地將內部機制當做是他們使用的接口的一部分。

2.接口和具體實現進行分離。

三、類的訪問權限

Java中,訪問權限修飾詞也可以用于確定庫中的哪些類對于該庫的使用者是可用的。

修飾詞必須放在關鍵字class之前。例如:

?
1
public class Widget{......}

?
1
improt access.Widget;

要知道,類不可以是private的(如果類是private的,那么除了該類之外,其他任何類都不可以訪問它),也不可以是protected的(其實一個內部類可以是private或protected的,但這是特例,后續文章中敘述),只可以是包訪問權限或public的。

如果不希望其他人訪問該類,可以把該類的所有構造器都指定為private,阻止任何人創建該類的對象。但這也有例外,這種做法不能阻止你在該類的static成員內部創建該類。我們來看下邊的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Soup1{
  private Soup1(){}
  public static Soup1 makeSoup(){ //使用靜態方法創建對象
    return new Soup1();
  }
}
 
class Soup2{
  private Soup2(){}
  private static Soup2 ps1 = new Soup2(); //使用單例模式創建對象
  public static Soup2 access(){
    return ps1;
  }
  public void f(){}
}
 
public class Lunch {
  void testPrivate(){
  //Soup1 soup = new Soup1; 不能執行
  }
  void testSingleton(){
    Soup2.access().f();
  }
}

我們可以看到,Soup1和Soup2類的構造器都是private的,誰也無法直接使用構造器來創建該類的對象了。但是我們也可以使用這兩個類:在Soup1中創建一個static方法,在這個方法中使用構造函數創建一個Soup1對象并返回它的引用;Soup2的創建用了設計模式中的單例模式,只能創建它的一個對象。Soup2類的對象是作為Soup2的一個static private成員而創建的,所以有且僅有一個,而且除非是通過public方法access(),否則是無法訪問到它的。

 此外,一些限制也值得注意:

1.每個編譯單元都只能有一個public類。

2.public類的名稱必須完全與含有給編譯單元的文件名相匹配,包括大小寫。

3.如果編譯單元內沒有帶public的類,這時可以對文件隨意命名。

 以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/songwenlong/p/6147825.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品怡红院永久免费 | 99视频一区| 国产在线乱子伦一区二区 | futa巨大好爽好长 | 亚洲人成网站在线观看90影院 | 四虎精品视频在线永久免费观看 | 日韩成人在线免费视频 | 精品国偷自产在线 | 国产视频一区在线观看 | 国产午夜亚洲精品一区网站 | 久久国产热视频99rev6 | 护士的小嫩嫩好紧好舒服 | 美女女女女女女bbbbbb毛片 | 日本不卡在线一区二区三区视频 | 免费观看在线 | 小寡妇好紧进去了好大看视频 | 男人的视频网站 | 亚洲国产第一区二区三区 | 好湿好紧好大野战 | 欧美久久一区二区三区 | 亚洲精品www久久久久久 | 欧美精品久久久亚洲 | 国产日韩欧美综合在线 | 黄a 大片a v 永久免费 | 欧洲第一区第二区第三区 | 4hc44四虎www在线影院男同 | www.com日本| 欧美精品综合一区二区三区 | 国产久热精品 | 精品高潮呻吟99AV无码视频 | 爱草影院 | 久久成人亚洲 | 日本人啪啪 | 齐天大性之七仙女欲春迅雷链接 | 日本人做受全过程视频 | 日本色播| 亚洲免费一 | 国产婷婷综合丁香亚洲欧洲 | 交换年轻夫妇HD中文字幕 | 久久成人伊人欧洲精品AV | 亚洲精品二三区伊人久久 |