public包內(nèi)包外均可訪問。
private只有本類可訪問。
protected針對繼承而使用的:1、包內(nèi)繼承,因?yàn)樵诎鼉?nèi),聲明為protected不影響它本來的friendly權(quán)限。
2、包外繼承,必須聲明為protected。
派生類可以訪問基類的protected成員。
注意不可將類設(shè)成private(那樣會使除類之外的其他東西都不能訪問它),也不能設(shè)成protected。因此,我們現(xiàn)在對于類的訪問只有兩個(gè)選擇:“友好的”或者public。若不愿其他任何人訪問那個(gè)類,可將所有構(gòu)建器設(shè)為private,這樣除你之外,沒有可以用類創(chuàng)建的了。而你可以使用static成員創(chuàng)建對象。
package com.access.external;
class Soup{
private Soup(){//構(gòu)造函數(shù)聲明為private,其它類不能用此構(gòu)造函數(shù)創(chuàng)建對象;
System.out.println("sffewe");
}
public static Soup makSoup(){//其它類可通過makSoup來創(chuàng)建對象;
return new Soup();
}
private static Soup ps1 = new Soup();//自己創(chuàng)建對象;
public static Soup access(){//返回對象的引用。
return ps1;
}
public void f(){}
}
class Sandwich{
void f(){
new Lunch();
}
}
public class Lunch {
void test(){
//Soup priv1 = new Soup();
Soup priv2 = Soup.makSoup();
Sandwich f1 = new Sandwich();
Soup.access().f();//不創(chuàng)建對象,但通過Soup中返回的對象引用調(diào)用其方法。
}
}
該方法返回一個(gè)句柄,它指向類Soup的一個(gè)對象。
Soup類向我們展示出如何通過將所有構(gòu)建器都設(shè)為private,從而防止直接創(chuàng)建一個(gè)類。請記住,假若不明確地至少創(chuàng)建一個(gè)構(gòu)建器,就會自動創(chuàng)建默認(rèn)構(gòu)建器(沒有自變量)。若自己編寫默認(rèn)構(gòu)建器,它就不會自動創(chuàng)建。把它變成private后,就沒人能為那個(gè)類創(chuàng)建一個(gè)對象。但別人怎樣使用這個(gè)類呢?上面的例子為我們揭示出了兩個(gè)選擇。第一個(gè)選擇,我們可創(chuàng)建一個(gè)static方法,再通過它創(chuàng)建一個(gè)新的Soup,然后返回指向它的一個(gè)句柄。如果想在返回之前對Soup進(jìn)行一些額外的操作,或者想了解準(zhǔn)備創(chuàng)建多少個(gè)Soup對象(可能是為了限制它們的個(gè)數(shù)),這種方案無疑是特別有用的。
第二個(gè)選擇是采用“設(shè)計(jì)方案”(Design Pattern)技術(shù),本書后面會對此進(jìn)行詳細(xì)介紹。通常方案叫作“獨(dú)子”,因?yàn)樗鼉H允許創(chuàng)建一個(gè)對象。類Soup的對象被創(chuàng)建成Soup的一個(gè)static private成員,所以有一個(gè)而且只能有一個(gè)。除非通過public方法access(),否則根本無法訪問它。