概述
一般來說,在Java中存在4中訪問權限修飾符:public,protected,包訪問權限,private。特別需要注意,包訪問權限並沒有對應的符號表示。
默認包機制
關於默認包,這裏多說一句。包的創建要位於一個Java文件(即源文件)的第一行,如使用下面的語句進行聲明。
package com.thinkinginjava.chapter05
對於沒有顯示使用package關鍵字聲明包名的類文件,則採用Java默認包機制,即相同目錄下所有不具有明確package聲明的文件,都被視作是該目錄下默認包的一部分。
修飾類成員
1)public:該成員可以被任何類訪問。
2)protected:protected修飾的成員不僅可被派生類訪問,而且也可以被同一個包內的其他類訪問,即使這些類並不是這個類的子類。
3)包訪問權限:對於類的成員,倘若前面沒有任何權限修飾符,該成員默認就是包訪問權限。
4)private:除了包含該成員的類,其他任何類都無法訪問該成員,private方法被自動認爲是final方法。
看下錶可能對訪問權限修飾符控制的訪問範圍更清晰。
示例
假設有2個文件c1.java,c2.java,他們在不同的包中,而c1(public修飾)有一個包訪問權限修飾的方法f1和public修飾的構造器。即使導入c1.java所在包,c2.java也無法使用f1,但是可以創建類c1的對象。
C1的定義如下
package Ch3;
public class C1 {
public C1()
{
System.out.println("C1的構造函數");
}
String f(String info){
return "C1 f方法"+info;
}
public void info(){System.out.println("C1 可以使用");}
}
C2的定義如下
package Ch4;
import Ch3.C1;
public class C2 {
public static void main(String[] args) {
C1 c1In = new C1();
// c1In.f(); // 無法訪問f方法,因爲是包訪問權限,而且在不同包中
c1In.info();
}
}
如果將c1也改爲包訪問權限,即class之前沒有修飾符,則連創建類c1的對象都不可以。或者將構造器改爲包訪問權限,那麼也無法創建類c1的對象。
修飾類
前面所說的是用來控制類成員的訪問權限,包括成員變量和成員函數等。而控制類的訪問權限僅有2個修飾符,分別是包訪問權限和public修飾符。但是對於內部類,情況有些許不同。內部類可以像成員變量和成員方法一樣使用private、包訪問權限、protected、public等權限修飾符。