《 Java 編程思想》CH06 訪問權限控制

  • 訪問控制(或隱藏具體實現)與「最初的實現並不恰當」有關
  • 重構即重寫代碼,以使得它更可讀,更容易理解,並所以而更具維護性。
  • 在面向對象設計中須要考慮一個基本問題:「如何把變更的事物與保持不變的事物區分開來」
  • 應該儘量將一切方法都定爲private,而僅向客戶端程序員公開你願意讓他們使用的方法。

包:庫單元

  • 包內包含有一組類,它們在單一的名字空間之下被組織在一塊兒
  • 爲了解決潛在的名字衝突問題,Java使用 package 對名稱空間進行徹底控制併爲每個類建立惟一的標識符組合。
  • 每個編譯單元(.java 文件)只能有一個 public 類。
  • 當編譯一個 Java 文件時,.java 文件中的每個類都會生成一個與其類名相同的 .class 文件
  • Java 可運行程序是一組能夠打包並壓縮爲一個 Java 文檔文件(JAR)的 .class 文件,Java解釋器負責這些文件的查找、裝載和解釋。
  • 類庫實際上一組類文件。其中每一個文件都有一個 public 類,以及任意數量的非 public 類。所以每一個文件都有一個構件,若是但願他們都屬於同一個羣組,則可使用關鍵詞 package。
  • package 語句必須是文件中除了註釋外的第一行代碼。如packgae access;表示當前文件是 access 類庫的一部分,標識符爲access.ClassName;
  • package 名稱的第一部分應該是域名的逆序。
  • package 名稱會被分解爲一個目錄路徑,這個包的全部文件都應該放在該文件夾中,例如包名爲fun.wuxiaobai24.access,則被解釋成$CLASSPATH/fun/wuxiaobai24/access,其中$CLASSPATH爲環境變量,CLASSPATH 能夠指定多個目錄。
  • 在使用JAR文件時,須要在 CLASSPATH 中指明JAR文件的真實路徑,如CLASSPATH = .;~/jar/access.jar
  • 若是將兩個包含相同名稱的類庫用*形式導入時,在使用重名的類時,須要指明是那個包中的,如fun.wuxiaobai24.access.ClassName c = new fun.wuxiaobai24.access.ClassName()
  • 使用import static語句進行靜態導入,將某個包中的全部靜態方法導入,這樣能夠直接用靜態方法名進行方法調用,而不用在前面加類名,如調用某個類中的 main() 方法時,靜態導入能夠直接main();,而普通的導入而須要ClassName.main();
  • Java 中 沒有 C 中的條件編譯,可是能夠用 import 來間接實現某些功能。

Java 訪問權限修飾詞

  • 包訪問權限容許將包內全部相關的類組合在一塊兒,以使得它們彼此之間能夠相互訪問做用。
  • 繼承而來的類能夠訪問publicprotected,只有當兩個類在同一個包中時才能訪問包訪問權限的成員。
  • 對於OOP而言,提供訪問器和變異器(getter/setter),以讀取或改變數值是最優雅的方法,而是 JavaBean 的基本原理。
  • 若是沒有給文件指定包,Java 將這些文件視爲該目錄的默認包中,因而給該目錄中全部其餘的文件提供包訪問權限。
  • 不能由於在類中某個對象的引用是 private,就認爲其餘對象就不能擁有該對象。
  • protected 成員除了繼承的子類能夠訪問外,它也有包訪問權限,即同一個包下的類能夠訪問它。
  • private 能夠用來實現單例子模式:
class Soup {
	private Soup() {}
	private static Soup soup = new Soup();
	public static Soup access() {
		return soup;
	}
}

接口和實現

訪問權限的控制常被稱爲具體實現的隱藏。把數據和方法包裝進類中,以及具體的實現的隱藏,常共同被稱爲封裝。其結果是一個同時帶有特徵和行爲的數據類型。java

訪問權限控制將權限的邊界劃在數據類型的內部的緣由:程序員

  • 不用擔憂客戶端程序員偶然地將內部機制看成他們可使用的接口的一部分。
  • 接口和具體實現的分離

類的訪問權限

爲了控制類的訪問權限,修飾詞必須出如今關鍵詞 class 以前,如public class ClassName。同時有一些額外的限制:設計

  • 每一個編譯單元(文件)都只能有一個 public 類。每一個編譯單元都有單一的公共接口,同 public 類實現
  • public 類的名稱必須與文件名相同,包括大小寫。
  • 編譯單元(文件)中能夠徹底不帶 public 類,此時能夠隨意對文件命名。

類的訪問權限只有 public 和包訪問權限。若是但願其餘任何人對該類有訪問權限,能夠將全部的構造器都指定爲 private,可是該類中 static 成員仍然能夠建立和訪問。code

本文首發於Code & Fun對象

相關文章
相關標籤/搜索