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)建對(duì)象也能直接訪問該方法。
*/
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類型,編譯通過,運(yùn)行的時(shí)候,仍然使用 "StaticTest03."的方式訪問。//該方法執(zhí)行不需要對(duì)象。//空的引用去訪問成員的時(shí)候會(huì)出現(xiàn)空指針異常。//m2方法不是“成員”而是靜態(tài)的。//所以即使引用是空的,也不會(huì)報(bào)空指針異常。(其實(shí)也就是說,m2 方法執(zhí)行底層是 不需要這個(gè)對(duì)象的。)(重要)
StaticTest03 s = null;
s.m2();
}
}
第三節(jié)
變量分類:
1.局部變量
2.成員變量(實(shí)例變量,非靜態(tài)變量)
3.靜態(tài)變量(方法區(qū))
什么時(shí)候變量聲明成靜態(tài)變量?(所有的java對(duì)象都有這個(gè)屬性,并且這個(gè)屬性對(duì)應(yīng)的值都是一樣的。沒必要讓每個(gè)對(duì)象都保留一份,我們聲明成靜態(tài)變量,在方法區(qū)塊只有一個(gè),所有的對(duì)象公用一個(gè),目的在節(jié)省內(nèi)存)靜態(tài)變量在類加載時(shí)初始化,而且只執(zhí)行一次。
如果這個(gè)屬性所有的對(duì)象都有,并且這個(gè)屬性的值是相同的,則該屬性聲明成
靜態(tài)的屬性。
成員變量:成員變量在創(chuàng)建對(duì)象的時(shí)候初始化,并且存儲(chǔ)在堆中的每一個(gè)對(duì)象中。
靜態(tài)變量:在類加載階段賦值,并且只賦值一次。
//靜態(tài)變量,被存儲(chǔ)在方法區(qū).
//所有的java對(duì)象共享這一份。沒必要在堆中創(chuàng)建去浪費(fèi)空間。
//所以靜態(tài)變量是類級(jí)別的,使用“類名.”的方式訪問.
第四節(jié) 單例模式
單例模式是23種設(shè)計(jì)模式中最簡(jiǎn)單的一種設(shè)計(jì)模式。
為了解決什么問題?為了保證JVM(虛擬機(jī))中某一個(gè)類型的java對(duì)象永遠(yuǎn)只有一個(gè)。為了節(jié)省內(nèi)存的開銷。(這就是優(yōu)點(diǎn))(我們知道對(duì)象創(chuàng)建完成戶,會(huì)放到堆中,如果堆中的實(shí)例過多,將會(huì)存在特別多的垃圾,這樣會(huì)導(dǎo)致一些問題,比如內(nèi)存溢出 ,使用單例模式,只會(huì)創(chuàng)建一個(gè)實(shí)例,顯著減少了對(duì)象實(shí)例的個(gè)數(shù),同時(shí)也提高了性能,因?yàn)椴粫?huì)頻繁的創(chuàng)建對(duì)象,這只是它的一個(gè)好處。)
//==兩邊如果是基本數(shù)據(jù)類型,可以比較這兩個(gè)基本數(shù)據(jù)類型是否相等。
//==兩邊如果是引用數(shù)據(jù)類型,則比較的是內(nèi)存地址。
實(shí)現(xiàn)單例模式
什么是設(shè)計(jì)模式:設(shè)計(jì)模式是可以重復(fù)利用的解決方案。
單例模式要領(lǐng):
1.構(gòu)造方法私有化
2.對(duì)外提供一個(gè)公開的靜態(tài)的獲取當(dāng)前類型對(duì)象的方法.
3.提供一個(gè)當(dāng)前類型的靜態(tài)變量。
單例模式分為兩種:
餓漢式單例:在類加載階段就創(chuàng)建了對(duì)象。
懶漢式單例:用到對(duì)象的時(shí)候才會(huì)創(chuàng)建對(duì)象。
public class Singleton{ //懶漢式單例
//靜態(tài)變量
private static Singleton s;
//將構(gòu)造方法私有化
private Singleton(){}
//對(duì)外提供一個(gè)公開獲取Singleton對(duì)象的方法.
public static Singleton getInstance(){
if(s==null){
s = new Singleton();
}
return s;
}
}
/*
餓漢式單例模式
*/
public class Customer{
//類加載時(shí)只執(zhí)行一次。
private static Customer c = new Customer();
//構(gòu)造方法私有化
private Customer(){}
//提供公開的方法
public static Customer getInstance(){
return c;
}
}+