一、static 靜態(tài)關(guān)鍵字
static:代表靜態(tài)的意思,可以修飾成員變量,可以修飾成員方法。
static 修飾方法之后稱為 靜態(tài)方法(類方法),修飾成員變量之后稱為 靜態(tài)成員變量(類變量)。
static 修飾后的成員變量,可以被類的所有對(duì)象共享 (訪問、修改)。
1.1 靜態(tài)成員變量與實(shí)例成員變量
靜態(tài)成員變量 | 實(shí)例成員變量 | |
---|---|---|
概述 | 有 static 修飾,屬于類,與類一起優(yōu)先被加載,內(nèi)存中只有一份,可以被共享訪問。 | 無 static 修飾,屬于對(duì)象,每個(gè)對(duì)象中都存在一份實(shí)例成員變量。 |
場(chǎng)景 | 如果信息要被共享,只需要一份就用,如:系統(tǒng)在線人數(shù)。 | 屬于每個(gè)對(duì)象,且每個(gè)對(duì)象的該信息不同時(shí),如:nameage,money… |
訪問規(guī)則 | ![]() |
![]() |
注意: 同一個(gè)類中,訪問靜態(tài)成員可以省略類名不寫。
1.2 靜態(tài)成員方法與實(shí)例成員方法
靜態(tài)成員方法 | 實(shí)例成員方法 | |
---|---|---|
概述 | 有 static 修飾,屬于類,與類一起優(yōu)先被加載一次,可以被共享訪問。 | 無 static 修飾,屬于對(duì)象,必須用對(duì)象觸發(fā)訪問。 |
場(chǎng)景 | 如果該方法是以執(zhí)行一個(gè)通用功能為目的,或者需要方便訪問。 | 如表示對(duì)象自己的行為的,且方法中需要直接訪問實(shí)例成員。 |
訪問規(guī)則 | ![]() |
![]() |
注意: 同一個(gè)類中,訪問靜態(tài)成員方法可以省略類名不寫。
1.3 static 訪問注意事項(xiàng)
靜態(tài)方法只能訪問靜態(tài)的成員,不可以直接訪問實(shí)例成員。
實(shí)例方法可以訪問靜態(tài)的成員,也可以訪問實(shí)例成員。
另外,靜態(tài)方法中是不可以出現(xiàn) this 關(guān)鍵字的。
public class Test {
// 靜態(tài)成員
public static int onlineNumber = 10;
// 實(shí)例成員
private String name = "heima";
/**
* 靜態(tài)方法
*/
public static void fun1(){
// 靜態(tài)成員方法可以訪問 靜態(tài)成員
System.out.println(Test.onlineNumber);
System.out.println(onlineNumber);
// System.out.println(name); // 報(bào)錯(cuò)
// 靜態(tài)成員方法不可以直接訪問實(shí)例成員
Test test = new Test();
System.out.println(test.name); // 間接訪問
// System.out.println(this); // 報(bào)錯(cuò)
}
/**
* 實(shí)例方法
*/
public void fun2(){
// 實(shí)例方法可以訪問 實(shí)例成員
System.out.println(this.name);
System.out.println(name);
// 實(shí)例方法可以訪問 靜態(tài)成員
System.out.println(Test.onlineNumber);
System.out.println(this.onlineNumber); // 不推薦
}
}
1.4 內(nèi)存使用情況
-
訪問靜態(tài)成員變量:與類一起優(yōu)先加載。
-
訪問靜態(tài)成員方法:與類一起優(yōu)先加載。
二、工具類
工具類里面都是靜態(tài)方法,可以完成一個(gè)共用功能。
好處: 一次編寫,處處可調(diào),提高代碼的復(fù)用,提高開發(fā)的效率。
注意:建議把工具類的構(gòu)造器私有化,因?yàn)楣ぞ哳悷o需對(duì)外創(chuàng)建對(duì)象,它的方法都是靜態(tài)方法,直接用類名訪問即可。
三、代碼塊
類的 5 大成分:成員變量、成員方法、構(gòu)造器、代碼塊、內(nèi)部類。
靜態(tài)代碼塊 ★ | 實(shí)例代碼塊 | |
---|---|---|
格式 | static {…} |
{…} |
特點(diǎn) | 屬于類,與類一起優(yōu)先加載,自動(dòng)觸發(fā)執(zhí)行一次。 | 屬于對(duì)象的,每次調(diào)用構(gòu)造器構(gòu)建對(duì)象前都會(huì)執(zhí)行一次,再執(zhí)行構(gòu)造器。 |
作用 | 可以用于在程序啟動(dòng)時(shí),進(jìn)行靜態(tài)資源的初始化操作。 | 可以用于初始化實(shí)例資源。 |
四、單例模式
單例模式: 可以保證系統(tǒng)中,應(yīng)用該模式的這個(gè)類永遠(yuǎn)只有一個(gè)實(shí)例,即一個(gè)類永遠(yuǎn)只能創(chuàng)建一個(gè)對(duì)象。
例如:任務(wù)管理器對(duì)象我們只需要一個(gè)就可以解決問題了,這樣可以節(jié)省內(nèi)存空間。
4.1 餓漢單例
特點(diǎn): 拿對(duì)象時(shí),對(duì)象已經(jīng)存在。
實(shí)現(xiàn): ① 構(gòu)造器私有 ② 定義靜態(tài)成員變量存儲(chǔ)一個(gè)對(duì)象。
/**
* 使用 餓漢單例實(shí)現(xiàn)單例類
*/
public class SingleInstance {
/**
* 2. 餓漢單例是在獲取對(duì)象前,對(duì)象已經(jīng)提前準(zhǔn)備好了一個(gè)
* 這個(gè)對(duì)象只能是一個(gè),所以定義靜態(tài)成員變量記住。
* 屬于類,只被加載一次
*/
public static SingleInstance instance = new SingleInstance();
/**
* 1. 必須把構(gòu)造器私有化
*/
private SingleInstance(){
}
}
4.2 懶漢單例
特點(diǎn): 要拿對(duì)象的時(shí)候,才開始創(chuàng)建一個(gè)對(duì)象。
實(shí)現(xiàn): ① 構(gòu)造器私有 ② 定義靜態(tài)成員變量,暫時(shí)不存對(duì)象。文章來源:http://www.zghlxwxcb.cn/news/detail-430362.html
/**
* 使用 懶漢單例實(shí)現(xiàn)單例類
* 在真正需要該對(duì)象的時(shí)候,才去創(chuàng)建一個(gè)對(duì)象(延遲加載對(duì)象)
*/
public class SingleInstance2 {
/**
* 2. 定義一個(gè)靜態(tài)的成員變量負(fù)責(zé)存儲(chǔ)一個(gè)對(duì)象
* 只加載一次,只有一份
* 如果設(shè)置為 public 那么其他類可通過 SingleInstance2.instance 訪問,訪問結(jié)果是 null
* 因此最好是私有化,避免挖坑
*/
private static SingleInstance2 instance;
/**
* 3. 提供一個(gè)方法,對(duì)外返回單例對(duì)象
*/
public static SingleInstance2 getInstance(){
if(instance == null){
instance = new SingleInstance2();
return instance;
}
return instance;
}
/**
* 1. 必須把構(gòu)造器私有化
*/
private SingleInstance2(){
}
}
文章參考:Java入門基礎(chǔ)視頻教程,java零基礎(chǔ)自學(xué)就選黑馬程序員Java入門教程(含Java項(xiàng)目和Java真題)文章來源地址http://www.zghlxwxcb.cn/news/detail-430362.html
到了這里,關(guān)于Java 基礎(chǔ)進(jìn)階篇(一)——— static 靜態(tài)關(guān)鍵字與單例模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!