Java?深入學(xué)習(xí)static關(guān)鍵字和靜態(tài)屬性及方法
static關(guān)鍵字
在定義一個類時,只是描述某事物的特征和行為,并沒有產(chǎn)生具體的數(shù)據(jù),只有通過new關(guān)鍵字創(chuàng)建該類的實例對象時,才會開辟棧內(nèi)存及內(nèi)存,在堆內(nèi)存中要保存對象的屬性時,每個對象會有自己的屬性。
如果希望某些屬性被所有對象共享,就必須將其聲明為static屬性,如果屬性使用了static關(guān)鍵字進行修飾,則該屬性可以直接使用類名稱進行調(diào)用,static關(guān)鍵字還可以修飾成員方法。
靜態(tài)屬性
如果在Java程序中使用static修飾屬性,則該屬性稱為靜態(tài)屬性(也稱全局屬性),靜態(tài)屬性可以使用類名直接訪問。
格式如下:
類名.屬性名
舉例:
class student1{ String name; int age; String school="A大學(xué)"; public student1(String name,int age){ this.name=name; this.age=age; } public void info(){ System.out.println("姓名:"+this.name+"年齡:"+this.age+"學(xué)校:"+school); } }
public class Example{ public static void main(String[]args){ student1 stu1=new student1("張三",10); student1 stu2=new student1("李四",20); student1 stu3=new student1("王五",18); stu1.info(); stu2.info(); stu3.info(); } }
輸出:
姓名:張三年齡:10學(xué)校:A大學(xué)
姓名:李四年齡:20學(xué)校:A大學(xué)
姓名:王五年齡:18學(xué)校:A大學(xué)
上述實例,三名同學(xué)均來自A大學(xué)。
假設(shè)現(xiàn)在A大學(xué)需要改名為B大學(xué),那么意味著,學(xué)校中所有學(xué)生的學(xué)校信息都要被修改,這樣做顯然是很麻煩的。
為了解決這種問題,我們可以使用static關(guān)鍵字修飾school屬性,將其變?yōu)楣矊傩?,school只會分配一塊內(nèi)存空間,被student類的所有對象共享,只要某個對象進行了一次修改,全部學(xué)生對象的school屬性值都會發(fā)生改變。
修改如下:
static String school="A大學(xué)";
stu1.school="B大學(xué)";//只修改stu1對象的學(xué)校屬性
輸出:
//stu1/stu2/stu3對象的school屬性都發(fā)生了變化
姓名:張三年齡:10學(xué)校:B大學(xué)
姓名:李四年齡:20學(xué)校:B大學(xué)
姓名:王五年齡:18學(xué)校:B大學(xué)
由此,可以得出這樣一個結(jié)論, static聲明的屬性是所有對象共享的。
自始至終,school屬性的內(nèi)存空間大小并未有任何改變。
靜態(tài)方法
如果想要使用類中的成員方法,就需要先將這個類實例化,而在實際開發(fā)時,開發(fā)人員有時候希望在不創(chuàng)建對象的情況下, 通過類名就可以直接調(diào)用某個方法 ,要實現(xiàn)這樣的效果, 只需要在成員方法前加上static關(guān)鍵字,使用static關(guān)鍵字修飾的方法通常稱為靜態(tài)方法。
同靜態(tài)變量一樣,靜態(tài)方法也可以通過類名和對象訪問。
類名.方法/實例對象名.方法
靜態(tài)方法的使用
舉例:
class Example{ public static void main(String[]args){ student1 stu1=new student1("張三",18); student1 stu2=new student1("jason",19); student1 stu3=new student1("小明",20); stu1.setAge(20);//最終將實例stu1的年齡屬性替換成20 stu2.setName("小紅");//最終將實例stu2的名字屬性替換成"小紅” //將所有實例的學(xué)校屬性替換成B大學(xué),由于它是使用static聲明的,所以可以直接使用類名進行調(diào)用 student1.setSchool("B大學(xué)"); stu1.info(); stu2.info(); stu3.info(); } }
class student1{ private String name; private int age; private static String school="A大學(xué)"; public student1(String name,int age){ this.name=name; this.age=age; } public void info(){ System.out.println("姓名:"+this.name+",年齡:"+this.age+",學(xué)校:"+school); } //將student1類的所有屬性進行封裝,要想更改屬性就必須使用setter方法 public String getName(){ return name; } public void setName(String name){ this.name=name; } public int getAge(){ return age; } public void setAge(int age){ this.age=age; } public static String getSchool(){ return school; } public static void setSchool(String school){ student1.school=school; } }
輸出:
姓名:張三,年齡:20,學(xué)校:B大學(xué)
姓名:小紅,年齡:19,學(xué)校:B大學(xué)
姓名:小明,年齡:20,學(xué)校:B大學(xué)
靜態(tài)方法只能訪問靜態(tài)成員,因為非靜態(tài)成員需要創(chuàng)建對象才能訪問,即隨著對象的創(chuàng)建,非靜態(tài)成員才會分配內(nèi)存,而靜態(tài)方法在被調(diào)用時可以不創(chuàng)建任何對象。
靜態(tài)代碼塊
在Java類中, 用static關(guān)鍵字修飾的代碼塊稱為靜態(tài)代碼塊 ,當(dāng)被類加載時,靜態(tài)代碼塊會執(zhí)行,由于類只加載一次,因為靜態(tài)代碼塊只執(zhí)行一次,在程序中,通常使用靜態(tài)代碼塊對類的成員變量進行初始化。
舉例:
class Example{ public static void main(String[]args){ student1 stu1=new student1(); student1 stu2=new student1(); student1 stu3=new student1(); } }
class student1{ String name; //構(gòu)造代碼塊 { System.out.println("我是構(gòu)造代碼塊"); } //靜態(tài)代碼塊 static{ System.out.println("我是靜態(tài)代碼塊"); } //構(gòu)造方法 public student1(){ System.out.println("我是student1類的構(gòu)造方法"); } }
輸出:
我是靜態(tài)代碼塊
我是構(gòu)造代碼塊
我是student1類的構(gòu)造方法
我是構(gòu)造代碼塊
我是student1類的構(gòu)造方法
我是構(gòu)造代碼塊
我是student1類的構(gòu)造方法
從輸出結(jié)果,我們不難看出, 代碼塊的執(zhí)行順序為靜態(tài)代碼塊—>構(gòu)造代碼塊----->構(gòu)造方法。
static修飾的量會隨著class文件一同加載,屬于優(yōu)先級最高的
上述實例中,雖然我們創(chuàng)建了三個實例化對象,但是靜態(tài)代碼塊中的內(nèi)容只被執(zhí)行了依次且是第一次被執(zhí)行,這就說明靜態(tài)代碼塊在類第一次使用時才會被加載,并且只會加載一次。
到此這篇關(guān)于Java 深入學(xué)習(xí)static關(guān)鍵字和靜態(tài)屬性及方法的文章就介紹到這了,更多相關(guān)Java static關(guān)鍵字 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
QTabWidget標簽實現(xiàn)雙擊關(guān)閉的方法(推薦)
這篇文章主要介紹了QTabWidget標簽實現(xiàn)雙擊關(guān)閉的方法(推薦)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-06-06JAVA8妙用Optional解決判斷Null為空的問題方法
本文主要介紹了JAVA8妙用Optional解決判斷Null為空的問題方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10Springboot注解之@EnableAutoConfiguration詳解
這篇文章主要介紹了Springboot注解之@EnableAutoConfiguration詳解,@EnableAutoConfiguration是一個加載Starter目錄包之外的需要Spring自動生成bean對象,本文對其進行總結(jié),需要的朋友可以參考下2023-08-08java開發(fā)CPU流水線與指令亂序執(zhí)行詳解
這篇文章主要為大家介紹了java開發(fā)CPU流水線與指令亂序執(zhí)行詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09詳談spring中bean注入無效和new創(chuàng)建對象的區(qū)別
這篇文章主要介紹了spring中bean注入無效和new創(chuàng)建對象的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02SpringBoot實現(xiàn)定時任務(wù)動態(tài)管理示例
這篇文章主要為大家介紹了SpringBoot實現(xiàn)定時任務(wù)動態(tài)管理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06springboot+redis自定義注解實現(xiàn)發(fā)布訂閱的實現(xiàn)代碼
在Redis中客戶端可以通過訂閱特定的頻道來接收發(fā)送至該頻道的消息,本文主要介紹了springboot+redis自定義注解實現(xiàn)發(fā)布訂閱,具有一定的參考價值,感興趣的可以了解一下2023-08-08