Java編程思想讀書筆記(5章)
發(fā)表時(shí)間:2024-05-21 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]第5章 隱藏實(shí)現(xiàn)細(xì)節(jié) 一.Java訪問權(quán)限飾詞(access specifiers) Java有public、protect、friendly、private四種訪問權(quán)限,并且這四訪問權(quán)限的訪問范圍越來越小。 1. friendly 1) 果一個(gè)class內(nèi)的數(shù)據(jù)成員或方法沒...
第5章 隱藏實(shí)現(xiàn)細(xì)節(jié) 一.Java訪問權(quán)限飾詞(access specifiers) Java有public、protect、friendly、private四種訪問權(quán)限,并且這四訪問權(quán)限的訪問范圍越來越小。
1. friendly
1) 果一個(gè)class內(nèi)的數(shù)據(jù)成員或方法沒有任何權(quán)限飾詞,那么它的缺省訪問權(quán)限就是friendly。同一個(gè)package內(nèi)的其它所有classes都可以訪問friendly成員,但對(duì)package以外的classes則形同private。
2)對(duì)于同一個(gè)文件夾下的、沒有用package的classes,Java會(huì)自動(dòng)將這些classes初見為隸屬于該目錄的default package,可以相互調(diào)用class中的friendly成員。如以下兩個(gè)class分別在同一個(gè)文件夾的兩個(gè)文件中,雖然沒有引入package,但隸屬于相同的default package。
class Sundae{
//以下兩個(gè)方法缺省為friendly
Sundae(){}
Void f() {System.out.println(“Sundae.f()”);
}
public class IceCream{
public static void main(String[] args){
Sundae x = new Sundae();
x.f();
}
}
2. public:可以被任何class調(diào)用
3. private:private成員只能在成員所屬的class內(nèi)被調(diào)用,如:
class Sundae{
private Sundae(){}//只能在Sundae class中被調(diào)用
Sundae(int i) {}
static Sundae makASundae() {
return new Sundae();
}
}
public class IceCream{
public static void main(String[] args){
// Sundae class中構(gòu)造函數(shù)Sundae()是private,
// 所以不能用它進(jìn)行初始化
//Sundae x = new Sundae();
Sundae y = new Sundae(1);//Sundae(int)是friendly,可以在此調(diào)用
Sundae z = Sundae.makASundae();
}
}
4. protected:具有friendly訪問權(quán)限的同時(shí),又能被subclass(當(dāng)然包括子孫類,即子類的子類)所訪問。即,既能被同一package中的classes訪問,又能被protected成員所在class的subclass訪問。
二.Class的訪問權(quán)限 1.Class同樣具有public、protect、friendly、private四種訪問訪問權(quán)限:
1)public:在任何地方都可被使用
2)protect、private:除了它自己,沒有任何class可以使用,所以class不能是
protected或private(inner class除外)
3) friendly:同一個(gè)package中的classes能用
2. 如何調(diào)用構(gòu)造函數(shù)被聲明為private的class
1) 用static函數(shù)
2) 用Singteton模式
class Soup{
private Soup(){}
//(1)靜態(tài)函數(shù)方法
public static Soup makeSout(){
return new Soup();
}
//(2)The "Singleton" pattern:
private static Soup ps1 = new Soup();
public static Soup access(){
return ps1;
}
public void f(String msg){
System.out.println("f(" + msg + ")");
}
}
public class Lunch{
public static void main(String[] args){
//Soup priv1 = new Soup();編譯錯(cuò)誤
Soup priv2 = Soup.makeSout();
Soup priv3 = Soup.access();
priv2.f("priv2");
priv3.f("priv3");
}