全目標(biāo)70分之 Java基礎(chǔ)(二):靜態(tài)、作用域與代碼塊

一、static關(guān)鍵字

? ? ? ? static在java中表示靜態(tài)的意思。

? ? ? ? 1、為什么使用static靜態(tài)關(guān)鍵字?

? ? ? ? ????如果將一個常用固定值字段定義為非靜態(tài)對象字段,則如果創(chuàng)建了100個對象,就會有100個對象實例,也會有100個該字段的實例字段,分別對應(yīng)每一個對象。但如果將其定義為靜態(tài)對象字段,則每個類只會有一個這樣的字段,意味著會節(jié)省很多不必要開支的內(nèi)存空間。

? ? ? ? ????靜態(tài)字段歸屬于類,意味著沒有創(chuàng)建該類的對象,也可以通過該類名獲取到該字段的值,十分方便。

? ? ? ? ????同理,static關(guān)鍵字修飾的方法,也可以被共享,被稱為靜態(tài)方法,也可以通過類名訪問到。

? ? ? ?? ???聲明格式:

? ? ? ? ????靜態(tài)字段? static 類型 字段名;? 訪問:類名.靜態(tài)字段名

? ? ? ????? 靜態(tài)方法? ?【訪問權(quán)限修飾符】 static 方法返回值 方法名(參數(shù)名)??訪問:類名.靜態(tài)方法名

? ? ? ? ????靜態(tài)代碼塊? ??

????????????????????????????static {

? ? ? ? ? ? ? ? ? ? ? ? ? ? }? ??

? ? ? ????? 靜態(tài)內(nèi)部類

? ? ? ? ? ? ? ? ? ? ? ? ? ? class 外部類名{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? public static class 內(nèi)部類名{

????????????????????????????????????????}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? 靜態(tài)變量除外部類內(nèi),只能聲明在靜態(tài)內(nèi)部類中??梢允褂脤ο笳{(diào)用靜態(tài)方法,是合法的,但這樣容易引起混淆,所以建議使用類名而不是對象來調(diào)用。

? ? ? ? 2、靜態(tài)常量

? ? ? ? ? ? 可以使用static 和 final關(guān)鍵字來定義一個靜態(tài)常量。

? ? ? ? ? ? public static final long serverId = 10000001L;

? ? ? ? ? ? 我們使用了兩個關(guān)鍵字來定義了一個靜態(tài)常量,而效果似乎和定義常量一樣,都是通過類名.字段名來訪問,而且都是無法更改,那么為什么要多此一舉呢?

? ? ? ? ? ? 是因為如果省略了static關(guān)鍵字,該常量字段就是變成了所屬類的一個實例字段,需要通過類的對象去訪問,而且每一個類的對象都一個該字段的副本,所以要加上static關(guān)鍵字,保證該類只會存在一份這樣的字段。

二、作用域

?java四個作用域關(guān)鍵字和范圍

? ? ????java三個作用域關(guān)鍵字,都可以來修飾類和實例的變量、方法(包括內(nèi)部類中不包含匿名內(nèi)部類、局部內(nèi)部類),但不可以用作方法內(nèi)修飾變量。default關(guān)鍵字無需聲明,不加修飾符即是default。

? ??1、public

? ? ? ? 定義為public的類、方法和變量即為公開的,可被其他類訪問。


? ? ? ? 但訪問方法、變量的前提是,先具有訪問到該類的權(quán)限才能進(jìn)一步的訪問。

? ? 2、private

? ? ? ? 定義為private的類(外部類也就是跟.java文件同名的類,不可以用private修飾)、方法、變量不可被其他類訪問,只對類內(nèi)部可見。


私有變量b、私有方法setB() 無法被其他類訪問到

? ? ? ? 3、protected

? ? ? ? ? ? ? 定義為protected的類(外部類無法修飾)、方法、變量,可被同包或子孫類訪問。

? ? ? ? 4、default

? ? ? ? ? ? ? 不加修飾符即是默認(rèn)修飾為default,類(包括外部類)、方法、變量可被同包的其他類訪問。

三、代碼塊

? ? ? ? 在java中{}中的即為代碼塊

? ? ? ? 執(zhí)行優(yōu)先級:靜態(tài)代碼塊>main方法>構(gòu)造代碼塊>構(gòu)造方法 (優(yōu)先級從高到低)

? ? ? ? 靜態(tài)代碼塊只會執(zhí)行一次,構(gòu)造代碼塊會在每次創(chuàng)建對象時執(zhí)行。

? ? ? ? 1、普通代碼塊:

? ? ? ? ? ? ? ?在方法或語句中的{}就是普通代碼塊,普通代碼和語句的執(zhí)行順序,由它們在代碼中的次序決定,前邊的就先執(zhí)行。


根據(jù)代碼出現(xiàn)的次序決定x最終的值

????????????可以看到在普通代碼塊中,變量的聲明有所不同,代碼塊中聲明的變量,方法語句中無法直接使用需再次聲明,聲明后下邊的代碼塊中可直接使用該變量,無需再次聲明。

? ? ? ? 2、構(gòu)造代碼塊:

? ? ? ? ? ? 類中{}中的就是構(gòu)造代碼塊,構(gòu)造代碼塊先于構(gòu)造方法執(zhí)行,在每次創(chuàng)建對象的時候。


每次創(chuàng)建對象時都會執(zhí)行構(gòu)造代碼塊,且先于構(gòu)造方法執(zhí)行

? ? ? ? 3、靜態(tài)代碼塊

? ? ? ? ? ? ? 類中加static修飾的{}的語句就是靜態(tài)代碼塊,由虛擬機(jī)控制只執(zhí)行一次,先于所有代碼塊及構(gòu)造方法執(zhí)行。


先于構(gòu)造代碼塊和構(gòu)造方法,且只執(zhí)行一次

? ? ? ? 4、同步代碼塊

? ? ? ? ? ? ? synchronized(obj){

? ? ? ? ? ? ? }

? ? ? ? 當(dāng)線程進(jìn)入以上代碼塊時,即進(jìn)入了同步代碼塊,將獲得obj的鎖。(學(xué)習(xí)并發(fā)程的時候再詳細(xì)講解)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容