熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

類訪問

2013-11-23 19:14:00  來源: Java核心技術 

  在Java中亦可用訪問指示符判斷出一個庫內的哪些類可由那個庫的用戶使用若想一個類能由客戶程序員調用可在類主體的起始花括號前面某處放置一個public關鍵字它控制著客戶程序員是否能夠創建屬於這個類的一個對象
  
  為控制一個類的訪問指示符必須在關鍵字class之前出現所以我們能夠使用
  
  public class Widget {
  
  也就是說假若我們的庫名是mylib那麼所有客戶程序員都能訪問Widget——通過下述語句
  
  import mylibWidget;
  
  或者
  
  import mylib*;
  
  然而我們同時還要注意到一些額外的限制
  
  () 每個編譯單元(文件)都只能有一個public類每個編譯單元有一個公共接口的概念是由那個公共類表達出來的根據自己的需要它可擁有任意多個提供支撐的友好但若在一個編譯單元裡使用了多個public類編譯器就會向我們提示一條出錯消息
  
  () public類的名字必須與包含了編譯單元的那個文件的名字完全相符甚至包括它的大小寫形式所以對於Widget來說文件的名字必須是Widgetjava而不應是widgetjava或者WIDGETjava同樣地如果出現不符就會報告一個編譯期錯誤
  
  () 可能(但並常見)有一個編譯單元根本沒有任何公共類此時可按自己的意願任意指定文件名
  
  如果已經獲得了mylib內部的一個類准備用它完成由Widget或者mylib內部的其他某些public類執行的任務此時又會出現什麼情況呢?我們不希望花費力氣為客戶程序員編制文檔並感覺以後某個時候也許會進行大手筆的修改並將自己的類一起刪掉換成另一個不同的類為獲得這種靈活處理的能力需要保證沒有客戶程序員能夠依賴自己隱藏於mylib內部的特定實施細節為達到這個目的只需將public關鍵字從類中剔除即可這樣便把類變成了友好的(類僅能在包內使用)
  
  注意不可將類設成private(那樣會使除類之外的其他東西都不能訪問它)也不能設成protected(注釋④)因此我們現在對於類的訪問只有兩個選擇友好的或者public若不願其他任何人訪問那個類可將所有構建器設為private這樣一來在類的一個static成員內部除自己之外的其他所有人都無法創建屬於那個類的一個對象(注釋⑤)如下例所示
  
  //: Lunchjava
  // Demonstrates class access specifiers
  // Make a class effectively private
  // with private constructors:
  
  class Soup {
   private Soup() {}
   // () Allow creation via static method:
   public static Soup makeSoup() {
    return new Soup();
   }
   // () Create a static object and
   // return a reference upon request
   // (The Singleton pattern):
   private static Soup ps = new Soup();
   public static Soup access() {
    return ps;
   }
   public void f() {}
  }
  
  class Sandwich { // Uses Lunch
   void f() { new Lunch(); }
  }
  
  // Only one public class allowed per file:
  public class Lunch {
   void test() {
    // Cant do this! Private constructor:
    //! Soup priv = new Soup();
    Soup priv = SoupmakeSoup();
    Sandwich f = new Sandwich();
    Soupaccess()f();
   }
  } ///:~
  
  ④實際上Java 內部類既可以是受到保護的也可以是私有的但那屬於特別情況章會詳細解釋這個問題
  
  ⑤亦可通過從那個類繼承來實現
  
  迄今為止我們創建過的大多數方法都是要麼返回void要麼返回一個基本數據類型所以對下述定義來說
  
  public static Soup access() {
  return psl;
  }
  
  它最開始多少會使人有些迷惑位於方法名(access)前的單詞指出方法到底返回什麼在這之前我們看到的都是void它意味著什麼也不返回(void在英語裡是虛無的意思但亦可返回指向一個對象的句柄此時出現的就是這個情況該方法返回一個句柄它指向類Soup的一個對象
  
  Soup類向我們展示出如何通過將所有構建器都設為private從而防止直接創建一個類請記住假若不明確地至少創建一個構建器就會自動創建默認構建器(沒有自變量)若自己編寫默認構建器它就不會自動創建把它變成private後就沒人能為那個類創建一個對象但別人怎樣使用這個類呢?上面的例子為我們揭示出了兩個選擇第一個選擇我們可創建一個static方法再通過它創建一個新的Soup然後返回指向它的一個句柄如果想在返回之前對Soup進行一些額外的操作或者想了解准備創建多少個Soup對象(可能是為了限制它們的個數)這種方案無疑是特別有用的
  
  第二個選擇是采用設計方案(Design Pattern)技術本書後面會對此進行詳細介紹通常方案叫作獨子因為它僅允許創建一個對象類Soup的對象被創建成Soup的一個static private成員所以有一個而且只能有一個除非通過public方法access()否則根本無法訪問它
  
  正如早先指出的那樣如果不針對類的訪問設置一個訪問指示符那麼它會自動默認為友好的這意味著那個類的對象可由包內的其他類創建但不能由包外創建請記住對於相同目錄內的所有文件如果沒有明確地進行package聲明那麼它們都默認為那個目錄的默認包的一部分然而假若那個類一個static成員的屬性是public那麼客戶程序員仍然能夠訪問那個static成員——即使它們不能創建屬於那個類的一個對象

From:http://tw.wingwit.com/Article/program/Java/hx/201311/26502.html
  • 上一篇文章:

  • 下一篇文章:
  • 相關文章
      没有相关文章
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.