關鍵字:static(靜態)
概念:
static是一個修飾符,用於修飾成員(成員變量和成員函數)。當成員被靜態修飾後,就多了一種調用方式:除了可以被對象調用外,還可以直接被類名調用。格式:類名.靜態成員;
特點:
隨着類的加載而加載,隨着類的消失而消失。所以生命週期長。
優先對象存在,被所以對象共享,可被類名所調用。
注意:
靜態方法只能訪問靜態成員,非靜態成員即可以訪問靜態也可以訪問非靜態。
靜態方法中不能定義this、super關鍵字。主函數是靜態的。
利:節省空間,可被類直接調用。
弊:生命週期長,訪問出現侷限性。
實例變量和類變量的區別:
存在位置:
靜態變量(類變量)隨着類的加載而存在於方法區中,實例變量隨着對象的建立而存在於堆內存中。
生命週期:
靜態變量隨着類的消失而消失,實例變量隨着對象的消失而消失。、
所屬範圍:
靜態屬於整個類,被整個類所共享,實例變量時對象的特有數據,所屬對象。
靜態代碼塊:
格式:static{
靜態代碼塊執行的語句
}
特點:
隨着類的加載而加載,只執行一次並優先於主函數執行,用於給類進行初化。
靜態代碼塊和構造代碼塊:
相同點:
都是jvm加載類時且在構造方法執行前執行,在類中科定義多個。
不同點:
靜態代碼塊只在第一次new時執行一次,之後不再執行,而構造函數在每一次new一次就執行一次。
構造代碼塊可在普通方法中定義,而靜態代碼塊不行。
局部代碼塊&構造代碼塊&靜態代碼塊的作用及使用情況:
什麼時候使用static?
當成員變量所存儲的數據,每個變量都擁有這個數據。此時就可以用static修飾該變量,讓所有對象共享該數據。
當成員函數沒有訪問對象的特有數據時,就可以將該方法定義成靜態。因爲該方法沒有訪問到對象的特有數據,所有我們再創建對象去調用方法是沒必要的,將該方法修飾爲靜態後,可直接用類名調用。
靜態的應用:
1.每一個應用程序中都有共性的功能,可以將這些功能進行抽取,獨立封裝,以便複用
2.將方法都靜態後,可方便於使用,但該類還可以被其他程序建立對象。爲了使程序更加嚴謹,強制讓該類不能建立對象,可通過將構造函數私有化實現。
設計模式
設計模式:解決某一類問題最行之有效的方法。共有23種。
單例設計模式:解決一個類在內存只存在一個對象。
餓漢式:
/*
單例設計模式之————餓漢式
Single類一進內存,就已經創建好了對象。
*/
class Single{
private int num;
private Single(){} //將構造函數私有化,防止創建對象
private static Single s = new Single();
//設置一個方法,返回創建的對象。
public static Single getInstance(){
return s;
}
//設置一個方法,改變變量num的值。
public void setNum(int num) {
this.num = num;
}
//設置一個方法,返回改變後的num值。
public int getNum() {
return num;
}
}
class SingleDemo {
public static void main(String[] args) {
Single s1 = Single.getInstance();
Single s2 = Single.getInstance();
s1.setNum(23);
System.out.println(s2.getNum());
}
}
懶漢式:
//對象是方法被調用時,才初始化,也叫做對象的延時加載。成爲:懶漢式。
//Single類進內存,對象還沒有存在,只有調用了getInstance方法時,才建立對象。
class Single{
private static Single s = null;
private Single(){}
public static Single getInstance(){
if(s==null){
synchronized(Single.class){
if(s==null)
s = new Single();
}
}
return s;
}
}