??小劇場??
阿花是一所大學的老師,班級周末組織了春游,她千叮萬囑大家必須要帶上一瓶水,但是她還是非常擔心有同學沒帶水,于是她帶了一瓶桶裝水在車上,到了檢查后發現大家還好都有帶水,但是她發現某個男同學已經把水喝完了,他固執地想喝另外一個女同學的水,女同學非常拒絕,這時還好阿花趕快抱出了這桶桶裝水,男同學好奇地問:“為什么我能喝這桶水,不能喝她的水啊?”阿花不緊不慢地說:“因為她的水是成員變數,這桶水是靜態變數呀”,
📒博客首頁:執梗的博客
🎉歡迎關注🔎點贊👍收藏??留言📝
?? :熱愛Java學習,期待一起交流!
🙏作者水平很有限,如果發現錯誤,求告知,多謝!
🔔 自動導航 🔔
??小劇場??
🎨 1.什么是Static關鍵字?
🎨 2.Static關鍵字的性質和特點
🐷 1.用來修飾成員方法和成員變數和代碼塊
🐷 2.靜態方法與靜態變數全決議
??回歸小劇場??
🌰3.靜態代碼塊
🌲 什么是類加載?
🌲靜態代碼塊有什么好處 ?
🌺 3.靜態變數VS普通成員變數
🎃 3.Static總結大全
🎨 1.什么是Static關鍵字?
Static是一個用來修飾成員變數或成員方法的關鍵字,經過Static的修飾后,它會變成靜態變數和靜態方法
🎨 2.Static關鍵字的性質和特點
🐷 1.用來修飾成員方法和成員變數和代碼塊
public class Demo {
static int a =10;//靜態成員變數
//靜態方法
public static void method(){
System.out.println("靜態方法");
}
static {
System.out.println("靜態代碼塊");
}
}
🌲 書寫格式:靜態變數 :static 資料型別 變數名 = 數值
靜態方法:權限 static 回傳值型別 方法名稱()
靜態代碼塊 :static{ 方法體 }
🐷 2.靜態方法與靜態變數全決議
首先我們要知道,被static修飾過的資源稱之為靜態資源,包括靜態變數和靜態代碼塊以及靜態資源,其中呼叫靜態變數和靜態方法可以直接通過類名去訪問,
public class Demo{
static int a =10;
int b=10;
public static void method(){
System.out.println("靜態方法");
}
public void method2(){
System.out.println("成員方法");
}
public static void main(String[] args) {
//呼叫成員變數和成員方法
Demo demo = new Demo();
demo.method2();//成員方法
System.out.println(demo.b);//10
//呼叫靜態變數和靜態方法
Demo.method();//靜態方法
System.out.println(Demo.a);//10
}
}
這里我們一定要發現:呼叫成員變數和方法時一定得有一個Demo類的實體物件demo,不然我們發現成員變數和方法都是無法訪問和呼叫的,而我們發現靜態變數和靜態方法,居然可以通過類名Demo直接訪問,這就能說明一個問題:成員變數和方法依賴于物件而生存,而靜態變數則依賴于類生存,這就可以回歸我們的小劇場了,
??回歸小劇場??
阿花的這個班級就好比一個類,每一位同學都是屬于這個類的物件,而每個同學的水壺都是屬于自己的成員變數,是不可以給別的物件訪問到的,要訪問這個變數也必須經過物件,這個變數只屬于這個物件,好比水壺只屬于擁有它的同學,阿花帶的大桶裝水,它不屬于任何一個同學,但它屬于這個班級,也就是依賴于這個班級也就是這個類生存,每一位同學也就是每一個物件都是可以去訪問它的,所以當我們需要訪問它時,只需要在它前面加上類名即可,即使班里沒有同學也就是沒有物件,也不會影響我們的這個大水桶(靜態變數),當然無論班里有多少同學,始終也都只會有這一個大水桶,也就是無論有多少個物件,都不會影響靜態變數,
🔔 靜態方法:成員方法其實也類比與成員變數,它不需要依照某個類而存在,當我們想直接通過類名去呼叫某個方法時,我們就可以將它設為靜態方法,因為不需要依賴物件,既然沒有物件,那就更談不上this關鍵字的,所以
🐤 在靜態方法中是不能呼叫非靜態的方法和變數,但是在非靜態的方法卻可以訪問靜態成員變數和方法(這就是為啥每次發現主函式呼叫某方法會報錯,因為主函式是靜態方法,而你呼叫的函式非靜態)
🌰3.靜態代碼塊
靜態代碼塊的格式在前面已經寫過了,那它既不是修飾一個變數,又不是修飾一個方法,而是修飾一段代碼,它到底有什么性質呢?
阿花的班級去春游的很開心,這時他們需要一起坐車回去了,這時大家需要排隊等車門打開然后挨個上車,那么請問門需要打開幾次?大家肯定都明白,門只用打開一次,從第一個開始進去之前就打開就好,總不能每進一個人就關上門重新打開進下一個人吧(當然也不是不可以 👀 )這種只需要在最開始完成一次的操作,我們就可以把它放入到靜態代碼塊中,它只會在最開始執行一次,后面就再也不會執行了,這時就有問題了,最開始到底是什么時候?答案是-------------類加載,
🌲 什么是類加載?
類加載這個東西,短時間內是無法講清楚的,有興趣的可以去搜索一下,在這里我只短暫地和提及,類加載顧名思義肯定是和類有關,我們知道我們寫的代碼都是交給jvm去處理的,我們經常會在代碼中定義各種各樣的類,什么學生類Studeng啊等等,jvm肯定是需要去認識它和處理它的,這種認識的程序就叫類加載,當然認識只需要一次(畢竟你認識一個異性也不需要多次認識吧 🙈 )
類加載只會執行一次,靜態代碼塊會在類加載時執行,所以永遠也只會執行一次,如果有多個靜態代碼塊,則它們按照順序執行,其實所有靜態資源都在類加載時就初始化好了,也就是說包括靜態變數和方法,
🌲靜態代碼塊有什么好處 ?
你問我有什么好處?你說前面門一開一關上一個人上的快,還是開一次所有人上完的效率更快?當然只是開個玩笑,其實靜態代碼塊同樣類似前面的靜態變數和方法的那個味道,它屬于類而不屬于實體物件,它可以優化我們的程式,提升效率(還不懂就再去看看上車的例子👿)
當然靜態資源不會被虛擬機GC回收掉,這樣記憶體負荷會很大,但是非static方法會在運行完畢后被回收,減輕記憶體壓力(所以不要想著每次寫個方法就加個static上去 👍 )
public class Demo{
static {
System.out.println("我是類加載");
}
public static void main(String[] args) {
System.out.println("我不是類加載");
}
}

🐋 這樣就很容易看出來static代碼塊執行的時間很早(類加載時期)
🌺 3.靜態變數VS普通成員變數
🍋 1.所屬不同 -----靜態變數屬于類,也叫類變數,成員變數屬于物件,所以也叫實體變數(物件變數)
🍋 2.記憶體存盤位置不同-------靜態變數存盤在方法區,成員變數存盤在堆記憶體
🍋 3.記憶體出現時間不同--------靜態變數隨著類的加載而加載,隨著類的消失而消失,成員變數隨著物件的創建而存在,隨著物件的消失而消失
🍋 4.訪問方式不同---------靜態變數可以通過類名訪問,也可以通過物件訪問,成員變數只能通過物件訪問,
🎃 3.Static總結大全
1.static關鍵字可以修飾成員變數和成員方法
2.static關鍵字的特點:
🌹 被類的所有物件所共享(判斷是否使用static的關鍵):
1.static修飾成員變數的值,該成員變數的值,就不存盤在物件中了,而是大度存盤了一份,被所有物件共享(多想想那個大水桶 💦 )
2.當static修飾成員方法的時候,該方法被當前類的所有物件共享,當前類物件.方法(和普通成員方法從共享的角度,幾乎沒有太大區別)
🌹 語法:類名.靜態變數 類名.靜態方法(實參串列)
🌹 靜態背景關系中(靜態方法體中),無法訪問非靜態的成員變數或方法,只能訪問靜態的成員和和方法
🌹static的使用場景:當我們希望某個成員變數的值,被該類所有物件共享時(再想想大水桶),可以使用static修飾,當我們需要定義一個工具方法給別人呼叫(其他類)時,此時可以將該方法定義為靜態方法,
?? 創作不易,如果有用請點贊收藏,期待Java交流也別忘記關注

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/348436.html
標籤:其他
