static關(guān)鍵字:
1.static修飾的變量叫做“靜態(tài)變量”.
2.static修飾的方法叫做“靜態(tài)方法”.
3.static還可以定義靜態(tài)語句塊.
以下例子演示:static定義靜態(tài)語句塊
static定義的靜態(tài)語句塊在類加載階段執(zhí)行脐嫂,并且只執(zhí)行一次枉疼,并且是自上而下的順序執(zhí)行。(main方法執(zhí)行之前,static就已經(jīng)執(zhí)行咙崎。從上而下的執(zhí)行部逮,先執(zhí)行static 后執(zhí)行main)
public class StaticTest01{
//靜態(tài)語句塊
static{
System.out.println("1");
}
static{
System.out.println("2");
}
static{
System.out.println("3");
//入口
public static void main(String[] args){
System.out.println("main execute!? 1");
System.out.println("main execute!? 2");
}
}
第二節(jié)
一般情況下工具類中的方法大部分都是靜態(tài)方法。
靜態(tài)方法不用創(chuàng)建對象也能直接訪問該方法友酱。
*/
public class StaticTest03{
//成員方法
//成員方法必須使用“引用.”調(diào)用
public void m1(){
}
//靜態(tài)方法
//可以使用“類名.”方式調(diào)用.也可以用“引用.”驳庭,即使用的是“引用.”刑顺,底層還是用的“類名.”? ,靜態(tài)方法中不能直接訪問非靜態(tài)數(shù)據(jù).? //靜態(tài)方法中不能使用this饲常、非靜態(tài)數(shù)據(jù)包括非靜態(tài)方法和成員變量蹲堂!
public static void m2(){
System.out.println("m2....");
}
//入口
public static void main(String[] args){
StaticTest03 st = new StaticTest03();
st.m1();
m2();
//靜態(tài)的方法按照正規(guī)的方式訪問:“類名.”? //靜態(tài)的方法也能用“引用.”訪問? st.m2(); //編譯階段檢查出st是StaticTest03類型,編譯通過贝淤,運行的時候柒竞,仍然使用 "StaticTest03."的方式訪問。//該方法執(zhí)行不需要對象播聪。//空的引用去訪問成員的時候會出現(xiàn)空指針異常朽基。//m2方法不是“成員”而是靜態(tài)的。//所以即使引用是空的离陶,也不會報空指針異常稼虎。(其實也就是說,m2 方法執(zhí)行底層是 不需要這個對象的招刨。)(重要)
StaticTest03 s = null;
s.m2();
}
}
第三節(jié)
變量分類:
1.局部變量
2.成員變量(實例變量霎俩,非靜態(tài)變量)
3.靜態(tài)變量(方法區(qū))
什么時候變量聲明成靜態(tài)變量?(所有的java對象都有這個屬性,并且這個屬性對應(yīng)的值都是一樣的打却。沒必要讓每個對象都保留一份杉适,我們聲明成靜態(tài)變量,在方法區(qū)塊只有一個柳击,所有的對象公用一個猿推,目的在節(jié)省內(nèi)存)靜態(tài)變量在類加載時初始化,而且只執(zhí)行一次捌肴。
如果這個屬性所有的對象都有蹬叭,并且這個屬性的值是相同的,則該屬性聲明成
靜態(tài)的屬性哭靖。
成員變量:成員變量在創(chuàng)建對象的時候初始化具垫,并且存儲在堆中的每一個對象中。
靜態(tài)變量:在類加載階段賦值试幽,并且只賦值一次筝蚕。
//靜態(tài)變量,被存儲在方法區(qū).
//所有的java對象共享這一份铺坞。沒必要在堆中創(chuàng)建去浪費空間起宽。
//所以靜態(tài)變量是類級別的,使用“類名.”的方式訪問.
第四節(jié) 單例模式
單例模式是23種設(shè)計模式中最簡單的一種設(shè)計模式济榨。
為了解決什么問題坯沪?為了保證JVM(虛擬機(jī))中某一個類型的java對象永遠(yuǎn)只有一個。為了節(jié)省內(nèi)存的開銷擒滑。(這就是優(yōu)點)(我們知道對象創(chuàng)建完成戶腐晾,會放到堆中,如果堆中的實例過多丐一,將會存在特別多的垃圾藻糖,這樣會導(dǎo)致一些問題,比如內(nèi)存溢出 库车,使用單例模式巨柒,只會創(chuàng)建一個實例,顯著減少了對象實例的個數(shù)柠衍,同時也提高了性能洋满,因為不會頻繁的創(chuàng)建對象,這只是它的一個好處珍坊。)
//==兩邊如果是基本數(shù)據(jù)類型牺勾,可以比較這兩個基本數(shù)據(jù)類型是否相等。
//==兩邊如果是引用數(shù)據(jù)類型阵漏,則比較的是內(nèi)存地址禽最。
實現(xiàn)單例模式
什么是設(shè)計模式:設(shè)計模式是可以重復(fù)利用的解決方案腺怯。
單例模式要領(lǐng):
1.構(gòu)造方法私有化
2.對外提供一個公開的靜態(tài)的獲取當(dāng)前類型對象的方法.
3.提供一個當(dāng)前類型的靜態(tài)變量袱饭。
單例模式分為兩種:
餓漢式單例:在類加載階段就創(chuàng)建了對象川无。
懶漢式單例:用到對象的時候才會創(chuàng)建對象。
public class Singleton{ //懶漢式單例
//靜態(tài)變量
private static Singleton s;
//將構(gòu)造方法私有化
private Singleton(){}
//對外提供一個公開獲取Singleton對象的方法.
public static Singleton getInstance(){
if(s==null){
s = new Singleton();
}
return s;
}
}
/*
餓漢式單例模式
*/
public class Customer{
//類加載時只執(zhí)行一次虑乖。
private static Customer c = new Customer();
//構(gòu)造方法私有化
private Customer(){}
//提供公開的方法
public static Customer getInstance(){
return c;
}
}+