??? ?? ????? ?? ???? ??? ????? ????.
public class Test { static{ System.out.println("test static 1"); } static{ System.out.println("test static 2"); } public static void main(String[] args) { } }
????? ?? ? Xiaobai Tongxiao? ??? ?? ?????. ??? ?????? main ????? ???? ???, ??? ??? ? ???? ??? ??? ?????...
運行結(jié)果: test static 1 test static 2
????? ???: ?? ?...????... ???? ?? ???? ????...
?? ? ??? ??? ??? code ?? ???? ?? ??, ???? ??? ??? ??? ???? ?? ????. ?? ???? JVM ??? ??? ???? ?? ?????! ??, ?? ? ??? ??? ??? ???? ????. ? ????? ???? ? ??? ?? ?? ? ??? ??? ? ? ????. 1. ?? ??? ?? ??? ???? ??? ?? ?? ???? ???? ????. ?? ???.
??? ???? ??? ??? ???? ???? ??? ? ????! ?? ???? ? ?? ?? ???
???? ??? ????? ?? ?? ?? ??? ???? ? ?????. ?? ??? ???? ?? ???? ??? ? ???, ????? ?? ?? ??? ?? ? ????. ???? ?? ???? ? ?? ??? ?? ??? ???? ???? ? ?? ?????. ?? ??? ???? ???? ??? ???? ? ?? ??? ? ?? ?????. ???? ??? ? ? ?? ?????. ??? ? ?? ???? ?? ?? ??? ??? ?? ?? ???? ?????.
[?? ??: java ??? ????]
2. static
1? ??? ??? static? ?? ??? ??? ???? ???? ?? ??? ??????. ??? ???
? ?? ???? ???? ??? ??? ???? ???? ??? ?? ?????.
"???? ???? ??? ???"??? ??? ??? ??????? ?, ???? ?? ??? ?? ???? ????. [?? ??? ? ???? ?? ?? ????? ?????. ?? ??? ???? ?? ????? ?? ? ??? ?? ?? ????. ], ??? ?? ???? ?? ?? ??? ??? ????? [self? ? ???? ?? ???? ??? ?????]... ?? ???? ?? ? ????. ???????2. ???? ?? ???? static?? ??? ??? ????, ???? ?? ??? ?? ???? ??????. ???? ????? ?? ??? ??? ?? ?? ??? ? ????. 3. ?? ?? ?? ???? ??? ? ??? ???? ??? ??? ??? ??? ? ?? ???? ????. ?? ???? ??? ??? ? ????!
4. ??? ?? ??? ??? ???? ???? ?????. ?, ???? ??? ??? ??? ???? ??? ???? ? ????.
3. ?? ?? ????
??? ???? ???? ???? ?????
?? ???? ?? ??? ???? ?? ? ?? ??? ?? ??? ???? ???. ? ???? ?? ?????? ????? ??? ????.
1. ?? ?? ??2. ???? ??? ??3. ?? ?? ??4. ?? ???? ??? ? ????. ]
5 , ?? ???? ????? ?? ????? ???? ?????...
4 ?? ??? ???? ??? ??
?? ??:
???? ??? ?? ??? ??? ????. ?? ??(??? ????? ?)?? ?? ?? ??? ??? ?? ? ???? ????.???? ??: ???? ???? ?? ?? ??? ???? ???? ???. ? ???? ??? ???? ?????. ? ?? ??? ??:
static? ?? ??? ???? ? ??? ? ????
5. ?? ??? ???? ??? ??? [?? ???? ??] ?? ??:
?? ??? ?? ???? ???? ??? ?? ???? ???? ??? ???? ???. ?? ???? ?? JVM? ?? ??? ?? ??? ??? ? ?? ?????. ???? ??: ??? ??? ??? ? ???? ?? ?? ??? ??? ?????. ???? ??? ???? ??? ???, ????? ??? ?? ? ??? ? ?? ?? ?? ??? ?? ???. .
?? ?? ??? IQ? ??? IQ?? ??? ???, ?? ?? ?? ????? ???. ??? ?? ??? ??? ?? ????. ?? ?? ?? ????? ?? ???? ????? ???.怎么理解呢?打個比喻吧...就比方說程序員小王是一個比較溫柔陽光的男孩子,這1024的這一天,老板閑的沒事,非要拉著程序員小王來玩耍,怎么個玩法呢?老板和小王一人拿著一把菜刀,規(guī)則很簡單,互相傷害,一人一刀,你一刀,我一刀....游戲一開始,老板二話不說,跳起來就是一刀,程序員小王二話也沒說反手就是一菜刀回去,這個時候老板發(fā)飆了,雙眼瞪得忒大,跳起來又是一刀,這個時候程序員小王不敢還手了,就沒動手。沒想到老板越來越生猛,左一刀右一刀全程下來差不多砍個半個時....程序員小王一直沒有還過手,因為小王知道他是老板...
這個程序員小王只會在老板第一次揮刀的時候,回老板一刀,之后就不還手了,這個時候我們把程序員小王看做是靜態(tài)變量,把老板第一次向小王揮刀看做是類加載,把小王回老板一刀看出是分配內(nèi)存空間,而一人一刀這個回合過程看成是類加載的過程,之后老板的每一刀都看成是創(chuàng)建一次對象。
連貫起來就是static變量值在類第一次加載的時候分配空間,以后創(chuàng)建類對象的時候不會重新分配
之后這個老板挨了一刀之后躺醫(yī)院了一年,一出院回到公司第一件事就是拉程序員宜春出來玩耍,老板殊不知其然,這個博主程序員宜春性格異常暴躁,老板遞給程序員宜春一把菜刀,博主宜春一接過菜刀,猝不及防的被老板跳起來就是一刀,程序員宜春痛的嗷了一聲,暴躁的程序員宜春還沒嗷完,在嗷的同時跳起來就是給老板一刀,接著老板跳起來又是一刀,程序員宜春嗷的一聲又是回一刀,老板跳起來又一刀,程序員宜春嗷的一聲又是回一刀,只要老板沒停程序員宜春就沒停,因為程序員宜春知道,就自己這曝脾氣,暴躁起來si都敢摸,肯定有幾個老鐵知道....
程序員宜春就類似實例變量,每次創(chuàng)建對象,都會為每個對象分配成員變量內(nèi)存空間,就像老板來一刀,程序員宜春都會回一刀這樣子的...
6、訪問靜態(tài)變量和實例變量的兩種方式
我們都知道靜態(tài)變量是屬于這個類,而不是屬于是對象,static獨立于對象。
但是各位有木有想過:靜態(tài)成員變量雖然獨立于對象,但是不代表不可以通過對象去訪問,所有的靜態(tài)方法和靜態(tài)變量都可以通過對象訪問【只要訪問權(quán)限足夠允許就行】,不理解沒關(guān)系,來個代碼就理解了
public class StaticDemo { static int value = 666; public static void main(String[] args) throws Exception{ new StaticDemo().method(); } private void method(){ int value = 123; System.out.println(this.value); } }
猜想一下結(jié)果,我猜你的結(jié)果是123,哈哈是咩?其實
運行結(jié)果: 666
回過頭再去品味一下上面的那段話,你就能非??陀^明了了,這個思想概念要有只是這種用法不推薦!
因此小結(jié)一下訪問靜態(tài)變量和實例變量的兩種方法:
靜態(tài)變量:
類名.靜態(tài)變量
對象.靜態(tài)變量(不推薦)
靜態(tài)方法:
類名.靜態(tài)方法
對象.靜態(tài)方法(不推薦)
7、static靜態(tài)方法
static修飾的方法也叫做靜態(tài)方法,不知道各位發(fā)現(xiàn)咩有,其實我們最熟悉的static靜態(tài)方法就是main方法了~小白童鞋:喔好像真的是哦~。由于對于靜態(tài)方法來說是不屬于任何實例對象的,this指的是當前對象,因為static靜態(tài)方法不屬于任何對象,所以就談不上this了。
還有一點就是:構(gòu)造方法不是靜態(tài)方法!
8、static靜態(tài)代碼塊
先看個程序吧,看看自個是否掌握了static代碼塊,下面程序代碼繼承關(guān)系為 BaseThree——> BaseTwo——> BaseOne
BaseOne類
package com.gx.initializationblock; public class BaseOne { public BaseOne() { System.out.println("BaseOne構(gòu)造器"); } { System.out.println("BaseOne初始化塊"); System.out.println(); } static { System.out.println("BaseOne靜態(tài)初始化塊"); } }
BaseTwo類
package com.gx.initializationblock; public class BaseTwo extends BaseOne { public BaseTwo() { System.out.println("BaseTwo構(gòu)造器"); } { System.out.println("BaseTwo初始化塊"); } static { System.out.println("BaseTwo靜態(tài)初始化塊"); } }
BaseThree 類
package com.gx.initializationblock; public class BaseThree extends BaseTwo { public BaseThree() { System.out.println("BaseThree構(gòu)造器"); } { System.out.println("BaseThree初始化塊"); } static { System.out.println("BaseThree靜態(tài)初始化塊"); } }
測試demo2類
package com.gx.initializationblock; /* 注:這里的ABC對應(yīng)BaseOne、BaseTwo、BaseThree * 多個類的繼承中初始化塊、靜態(tài)初始化塊、構(gòu)造器的執(zhí)行順序 在繼承中,先后執(zhí)行父類A的靜態(tài)塊,父類B的靜態(tài)塊,最后子類的靜態(tài)塊, 然后再執(zhí)行父類A的非靜態(tài)塊和構(gòu)造器,然后是B類的非靜態(tài)塊和構(gòu)造器,最后執(zhí)行子類的非靜態(tài)塊和構(gòu)造器 */ public class Demo2 { public static void main(String[] args) { BaseThree baseThree = new BaseThree(); System.out.println("-----"); BaseThree baseThree2 = new BaseThree(); } }
運行結(jié)果
BaseOne靜態(tài)初始化塊 BaseTwo靜態(tài)初始化塊 BaseThree靜態(tài)初始化塊 BaseOne初始化塊 BaseOne構(gòu)造器 BaseTwo初始化塊 BaseTwo構(gòu)造器 BaseThree初始化塊 BaseThree構(gòu)造器 ----- BaseOne初始化塊 BaseOne構(gòu)造器 BaseTwo初始化塊 BaseTwo構(gòu)造器 BaseThree初始化塊 BaseThree構(gòu)造器
至于static代碼塊運行結(jié)果不是很清晰的童鞋,詳細講解請看這篇Static靜態(tài)代碼塊以及各代碼塊之間的執(zhí)行順序
以上僅僅是讓各位明確代碼塊之間的運行順序,顯然還是不夠的,靜態(tài)代碼塊通常用來對靜態(tài)變量進行一些初始化操作,比如定義枚舉類,代碼如下:
public enum WeekDayEnum { MONDAY(1,"周一"), TUESDAY(2, "周二"), WEDNESDAY(3, "周三"), THURSDAY(4, "周四"), FRIDAY(5, "周五"), SATURDAY(6, "周六"), SUNDAY(7, "周日"); private int code; private String desc; WeekDayEnum(int code, String desc) { this.code = code; this.desc = desc; } private static final Map<Integer, WeekDayEnum> WEEK_ENUM_MAP = new HashMap<Integer, WeekDayEnum>(); // 對map進行初始化 static { for (WeekDayEnum weekDay : WeekDayEnum.values()) { WEEK_ENUM_MAP.put(weekDay.getCode(), weekDay); } } public static WeekDayEnum findByCode(int code) { return WEEK_ENUM_MAP.get(code); } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } }
當然不僅僅是枚舉這一方面,還有我們熟悉的單例模式同樣也用到了靜態(tài)代碼塊,如下:
public class Singleton { private static Singleton instance; static { instance = new Singleton(); } private Singleton() {} public static Singleton getInstance() { return instance; } }
9、static變量與普通變量區(qū)別
static變量也稱作靜態(tài)變量,靜態(tài)變量和非靜態(tài)變量的區(qū)別是:靜態(tài)變量被所有的對象所共享,在內(nèi)存中只有一個副本,它當且僅當在類初次加載時會被初始化。而非靜態(tài)變量是對象所擁有的,在創(chuàng)建對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響。
還有一點就是static成員變量的初始化順序按照定義的順序進行初始化。
10、靜態(tài)內(nèi)部類
靜態(tài)內(nèi)部類與非靜態(tài)內(nèi)部類之間存在一個最大的區(qū)別,我們知道非靜態(tài)內(nèi)部類在編譯完成之后會隱含地保存著一個引用,該引用是指向創(chuàng)建它的外圍內(nèi),但是靜態(tài)內(nèi)部類卻沒有。沒有這個引用就意味著:
1、它的創(chuàng)建是不需要依賴外圍類的創(chuàng)建。
2、它不能使用任何外圍類的非static成員變量和方法。
代碼舉例(靜態(tài)內(nèi)部類實現(xiàn)單例模式)
public class Singleton { // 聲明為 private 避免調(diào)用默認構(gòu)造方法創(chuàng)建對象 private Singleton() { } // 聲明為 private 表明靜態(tài)內(nèi)部該類只能在該 Singleton 類中被訪問 private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getUniqueInstance() { return SingletonHolder.INSTANCE; } }
當 Singleton
類加載時,靜態(tài)內(nèi)部類 SingletonHolder
沒有被加載進內(nèi)存。只有當調(diào)用 getUniqueInstance()
方法從而觸發(fā) SingletonHolder.INSTANCE
時 SingletonHolder
才會被加載,此時初始化 INSTANCE
實例,并且 JVM 能確保 INSTANCE
只被實例化一次。
這種方式不僅具有延遲初始化的好處,而且由 JVM 提供了對線程安全的支持。
11、靜態(tài)導(dǎo)包
靜態(tài)導(dǎo)包格式:import static
這兩個關(guān)鍵字連用可以指定導(dǎo)入某個類中的指定靜態(tài)資源,并且不需要使用類名調(diào)用類中靜態(tài)成員,可以直接使用類中靜態(tài)成員變量和成員方法
// Math. --- 將Math中的所有靜態(tài)資源導(dǎo)入,這時候可以直接使用里面的靜態(tài)方法,而不用通過類名進行調(diào)用 // 如果只想導(dǎo)入單一某個靜態(tài)方法,只需要將換成對應(yīng)的方法名即可 import static java.lang.Math.; // 換成import static java.lang.Math.max;具有一樣的效果 public class Demo { public static void main(String[] args) { int max = max(1,2); System.out.println(max); } }
靜態(tài)導(dǎo)包在書寫代碼的時候確實能省一點代碼,可以直接調(diào)用里面的靜態(tài)成員,但是會影響代碼可讀性,所以開發(fā)中一般情況下不建議這么使用。
12、static注意事項
1、靜態(tài)只能訪問靜態(tài)。
2、非靜態(tài)既可以訪問非靜態(tài)的,也可以訪問靜態(tài)的。
13、final與static的藕斷絲連
到這里文章本該結(jié)束了的,但是static的使用始終離不開final字眼,二者可謂藕斷絲連,常常繁見,我覺得還是很有必要講講,那么一起來看看下面這個程序吧。
package Demo; class FinalDemo { public final double i = Math.random(); public static double t = Math.random(); } public class DemoDemo { public static void main(String[] args) { FinalDemo demo1 = new FinalDemo(); FinalDemo demo2 = new FinalDemo(); System.out.println("final修飾的 i=" + demo1.i); System.out.println("static修飾的 t=" + demo1.t); System.out.println("final修飾的 i=" + demo2.i); System.out.println("static修飾的 t=" + demo2.t); System.out.println("t+1= "+ ++demo2.t ); // System.out.println( ++demo2.i );//編譯失敗 } } 運行結(jié)果: final修飾的 i=0.7282093281367935 static修飾的 t=0.30720545678577604 final修飾的 i=0.8106990945706758 static修飾的 t=0.30720545678577604 t+1= 1.307205456785776
static修飾的變量沒有發(fā)生變化是因為static作用于成員變量只是用來表示保存一份副本,其不會發(fā)生變化。怎么理解這個副本呢?其實static修飾的在類加載的時候就加載完成了(初始化),而且只會加載一次也就是說初始化一次,所以不會發(fā)生變化!
至于final修飾的反而發(fā)生變化了?是不是巔覆你對final的看法?關(guān)于final詳細講解博主也準備好了一篇文章程序員你真的理解final關(guān)鍵字嗎?
ok,文章就先到這里了,希望這篇文章能夠幫助到你對static的認識,若有不足或者不正之處,希望諒解并歡迎批評指正!
本文來自?java入門?欄目,歡迎學(xué)習(xí)!
? ??? ?? ???? ?? ?? ??? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)

JDBC ????? ???? ????? ?? ?? ?? ??? ?? ?? ??? ?? ? ?? ??? ?? ?? ?? ??? ???????. 1. ????? ????? Conn.SetAutoCommit (False)?? ??????. 2. ??? ? ????? ?? ?? SQL ??? ?????. 3. ?? ??? ??? ?? Conn.commit ()?? ???? ??? ???? ???? ?? ??? ???? Conn.Rollback ()?? ??????. ???, ? ??? ???? ????, ??? ???? ????, ?? ??? ??? ?? ??? ??? ???? ? ???????. ?? ?? ?? ???? ????? ??? ???? ?? ?? ???? ???? ??? ????? ?? ??? ??? ? ?? ???? ?? ????.

?? ?? ? ?? ???? ???? ?? Java.Time ???? ???? ??????. 2. LocalDate, LocalDateTime ? LocalTime? ?? ?? ??? ??? ?????. 3. () ???? ???? ?? ??? ??? ????. 4. ???/???? ??? ???? ??? ????? ??? ??????. 5. ZonedDateTime ? Zoneid? ???? ???? ??????. 6. DateTimeFormatter? ?? ?? ? ?? ?? ?? ???; 7. ??? ?? ?? ?? ??? ????? ?? ??????. ?? Java? ?? ??? ???? ??? ??? ???? Java.Timeapi ??? ?? ??? ???????.

Pre-FormancetArtUptimeMoryUsage, Quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless sinarios.2.thyvelopecosyste,

NetworkPortSandfirewallsworkTogetToenableCommunication whileensuringsecurity.1.networkportSarevirtualendpointsnumbered0–65535, Withwell-nownports like80 (http), 443 (https), 22 (ssh) ? 25 (smtp) ?? (specservices

Java 's Garbage Collection (GC)? ???? ???? ???? ??????, ?? ? ??? ??? ? ??? ??? ??? ??? ????. 1.GC? ?? ?? (? : ?? ??, ?? ???, ?? ?? ?)?? ??? ???? ????, ?? ? ??? ??? ???? ?????. 2. ?? ???? ????? ????, ?? ?? ??? ??? ???? ?? ??? ??????. 3. ?? ?? ?? ?? : ??? ?? (Eden, S0, S1)? ?? ????? ?????. ??? ??? ?? ? MajorGC? ???? ? ??? ? ????. Metaspace? ??? ?? ???? ?????. 4. JVM? ??? GC ??? ?????. SerialGC? ??? ?? ????? ?????. ParallelGC? ???? ??????. CMS? ?? ???

??? htmlinput ??? ???? ??? ???? ????? ??? ??? ?? ??? ???? ???? ? ????. 1. ???, ???, ??, ?? ? ??? ?? ??? ??? ?? ?? ?? ??? ???? ???? ??? ? ???? ??? ? ????. 2. HTML5? ?????? ??? ? ?? ?? ??? ?? ? ??? URL, ??, ?? ? ??? ?? ??? ??? ??????. 3. ?? ?? ? ? ??? ??? ???? ?? ??? ???? ???? ?? ???? ?? ???? ???? ?? ? ? ??? ?? ???????.

GradleisBetTerChoiceFormostNewProjectSduetoitssuperiorflexible, Performance, and ModernToolingsupport.1.Gradle'Sgroovy/kotlindslismoreConcisENDEXPRESSIVETHANMAVEN'SVOSEXML.2.GradleOutsMaveninbuildweedweedweedweedweedweedweedweedweedweedweedweedweedweede

DEFER? ??? ???? ?? ??? ??? ???? ? ?????. ?? ??? ?? ? ? ?? ????, ??? ??? ? ?? ?? (LIFO)? ??? ?????. 1. ?? ??? ??? ? ??? ?????. 2. ?? ??? ?? ??? ??? ????? ?????. 3. ?? ? ?? ?? ??? ? ????. 4. ??? ?????? ??? ??? ???? ?????. 5. ?? ??? ???? ?? ??? ?? ??? ?????. ??? ??? ?? ?? ? ???? ???? ? ????.
