1、訪問權限符:
(1)public:
對於成員來說:任何其他類都可以訪問它們,不管在同一個包中還是在另外的包中。
對於類來說: 也是一樣。
(2)friendly:
對於成員老說:如果一個類的成員沒有任何權限修飾,那么它門就是缺省包訪問權限,用friendly來表示,注
意friendly不是Java中的關鍵字,這里是個人喜歡的方式用它表示而已。同一個包內其它類可以訪問,但包外
就不可以。對於同一個文件夾下的、沒有用package的classes,Java會自動將這些classes初見為隸屬於該目錄
的default package,可以相互調用class中的friendly成員。如以下兩個class分別在同一個文件夾的兩個文件
中,雖然沒有引入package,但隸屬於相同的default package。
class Sundae{
//以下兩個方法缺省為friendly
Sundae(){}
Void f() {System.out.println(“Sundae.f()”);
}
public class IceCream{
public static void main(String[] args){
Sundae x = new Sundae();
x.f();
}
}
對於類來說:同一個包中的類可以用。總之,類只可以聲明為public或者friendly。
(3)private:
對於對於成員來說:只能在該成員隸屬於的類中訪問。
class Sundae{
private Sundae(){}//只能在Sundae class中被調用
Sundae(int i) {}
static Sundae makASundae() {
return new Sundae();
}
}
public class IceCream{
public static void main(String[] args){
// Sundae class中構造函數Sundae()是private,
// 所以不能用它進行初始化
//Sundae x = new Sundae();
Sundae y = new Sundae(1);//Sundae(int)是friendly,可以在此調用
Sundae z = Sundae.makASundae();
}
}
對於類來說:類不可以聲明為private。
(4)protected:
對於對於成員來說:相同包中的類可以訪問(包訪問權限);基類通過protected把基類中的成員的訪問權限賦予派生類不是所有類(派生類訪問權限)。
例子:package c05.local;
import pack1.Cookie;
//注意:在這里ChocolateChip繼承了類Cookie,按道理bite()方法也在
//ChocolateChip中,可以用x.bite直接調用,但是不可以的,因為類ChocolateChip
//和Cookie類不在一個包中,各自具有包訪問權限,為了能夠使用x.bite()必須要把
//Cookie方法的訪問權限換成public或者protected,但是一旦換成public所有的人就
//可以訪問了,這樣達不到隱私的要求,所以設置成protected最好,既可以順利訪問,也可以
//避免外面的類調用,保護好隱私的作用
public class ChocolateChip extends Cookie {
public ChocolateChip() {
System.out.println("ChocolateChip constructor");
}
public static void main(String[] args) {
ChocolateChip x = new ChocolateChip();
x.bite(); // Can't access bite
}
} ///:~
package pack1;
public class Cookie {
public Cookie()
{
System.out.println("Cookie constructor");
}
protected void bite(){System.out.println("bite");}
}
對於類來說:類不可以聲明為protected
對於類的權限修飾,下面有更好的解釋:
Class類的訪問權限:
public:可以供所有的類訪問。
默認:默認可以稱為friendly但是,java語言中是沒有friendly這個修飾符的,這樣稱呼應該是來源於c++。默認的訪問權限是包級訪問權限。
即如果寫了一個類沒有寫訪問權限修飾符,那么就是默認的訪問權限,同一個包下的類都可以訪問到,即使可以實例化該類
(當然如果這個類不具有實例化的能力除外,比如該類沒有提供public的構造函數)。
說明:
1、每個編譯單元(類文件)都僅能有一個public class
2、public class的名稱(包含大小寫)必須和其類文件同名。
3、一個類文件(*.java)中可以不存在public class。
這種形式的存在的場景:如果我們在某個包內撰寫一個class,僅僅是為了配合同包內的其他類工作,而且
我們不想再為了撰寫說明文檔給客戶(不一定是現實意義的客戶,可能是調用這個類的類)看而傷腦筋,而且有可能過一段時間之后
有可能會徹底改變原有的做法,並完全舍棄舊版本,以全新的版本代替。
4、class不可以是private和protected。
5、如果不希望那個任何產生某個class的對象,可以將該類得所有構造函數設置成private。但是即使這樣也可以生成該類的對象,就是class的static的成員(屬性和方法)可以辦到。
