[Java] 訪問權限控制

1. 包

包內包含有一組類,它們在單一的名字空間下被組織到一起。例如Java標準發佈中有一個工具庫,它被組織在java.util名字空間之下。Java.util中有一個ArrayList類,使用它可以用其全名,例如:

public class Test {
  public static void main(String[] args) {
    java.util.ArrayList list = new java.util.ArrayList();
  }
}

這個語句使程序變得很冗長,因此可以轉而使用import關鍵字,如果想導入單個類,可以在import語句中命名該類,例如:

import java.util.ArrayList;
public class Test {
  public static void main(String[] args) {
    ArrayList list = new ArrayList();
  }
}

如果想導入其中所有的類,只需要使用"*",例如:

import java.util.*;

之所以要使用導入,就是要提供一個管理名字空間的機制。由於類名之間存在潛在衝突,在Java中對名稱空間進行完全控制併爲每個類創建唯一的標識符組合就成爲非常重要的事情。

當編寫一個Java源代碼文件時,此文件通常被稱爲編譯單元,它們都必須有一個後綴名.java,而在編譯單元內則可以有一個public類,該類的名稱必須與文件的名稱相同(包括大小寫,但不包括後綴名),每個編譯單元只能有一個public類。

當編譯一個.java文件時,文件中的每個類都會有一個輸出文件,而該輸出文件的名稱與文件中每個類的名稱相同,只是多了一個後綴名.class。Java可運行程序是一組可以打包並壓縮爲一個Java文檔文件(JAR文件)的.class文件。Java解釋器負責這些文件的查找、裝載和解釋。

類庫實際上是一組類文件,其中每個文件都有一個public類,以及任意數量的非public類,因此每個文件都有一個構件,如果希望這些構件從屬於同一個羣組,就可以使用關鍵字package,並且它必須是文件中除註釋外的第一句程序代碼,例如:

package access.mypackage;
public class MyClass {
}

如果有人想用MyClass,必須使用import關鍵字來使access中的名稱可用,例如:

import access.mypackage.*;
public class Test {
  public static void main(String[] args) {
    MyClass m = new MyClass();
  }
}


2. 訪問權限修飾

Java訪問權限修飾詞包括public、protected和private,置於類中每個成員的定義之前,每個訪問權限修飾詞僅控制它所修飾的特定定義的訪問權。如果不提供任何訪問權限修飾詞,則意味着它是包訪問權限。包訪問權限意味着當前包中的所有其他類對那個成員都有訪問權限,但對於這個包之外的所有類,這個成員卻是private。

類控制着哪些代碼有權訪問自己的成員,取得對某成員的訪問權的方法是,要麼使該成員成爲public,要麼通過不加訪問權限修飾詞並將其他類放置於同一個包內賦予訪問權,另外,繼承而來的類即可以訪問public成員,也可以訪問protected成員。

使用關鍵字public,意味着public之後緊跟着的成員聲明自己對每個人都是可用的,例如:

class Test {
  public void SayHello() {
    System.out.println("Hello World!");
  }
}
public class Main {
  public static void main(String[] args) {
    Test t = new Test();
    t.SayHello();
  }
}

關鍵字private的意思是,除了包含該成員的類之外,其他任何類都無法訪問這個成員,例如:

class Test {
  private Test() {}
  static Test makeTest() {
    return new Test();
  }
}
public class Main {
  public static void main(String[] args) {
    Test t = Test.makeTest();
  }
}

關鍵字protected處理的是繼承的概念,通過繼承可以利用一個現有類,爲了從現有類中繼承,需要聲明新類exntends一個現有類,例如:

class SubTest extends Test {
}

基類的創建者如果希望特定成員對它的訪問權限賦予派生類而不是所有類,就需要protected來完成,protected也提供包訪問權限,也就是說,相同包內的其他類可以訪問protected元素,例如:

class Test {
  protected void sayHello() {
    System.out.println("Hello World!");
  }
}
public class Main {
  public static void main(String[] args) {
    Test t = new Test();
    t.sayHello();
  }
}


3. 類訪問權限

在Java中,訪問權限修飾詞也可以用於確定庫中的哪些類對於該庫的使用者是可用的,如果希望某個類可以被使用,可以通過把關鍵字public作用於整個類的定義來達到目的,例如:

public class Test {
}

然而,還有一些額外的限制,每個編譯單元都只能有一個public類,這表示每個編譯單元都有單一的公共接口,用public類來表現。public類的名稱必須與含有該編譯單元的文件名相匹配,包括大小寫。此外編譯單元內不帶public類也是可以的,不帶權限修飾詞的類擁有包訪問權限,即該類只可以用於該包之中。

需要注意的是,類即不可以是private的,也不可以是protected的,所以對於類的訪問權限,權有兩個選擇:包訪問權限或public。如果不希望其他任何人對該類擁有訪問權限,可以把所有的構造器都指定爲private,從而阻止任何人創建該類的對象,只有一個例外,即在該類的static成員內部創建。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章