Java中Static關(guān)鍵字的五種用法詳解
Static的五種用法大致如下:
- 修飾成員變量,使其成為類變量,也叫靜態(tài)變量
- 修飾成員方法,使其成為類方法
- 修飾內(nèi)部類,使其成為靜態(tài)內(nèi)部類
- 靜態(tài)代碼塊
- 靜態(tài)導(dǎo)包
直接一點,static關(guān)鍵字就是把屬性和方法變?yōu)轭愊嚓P(guān),而不是實例相關(guān)。
修飾成員變量
被static關(guān)鍵字修飾的屬性叫做靜態(tài)屬性,也叫類屬性。顧名思義現(xiàn)在該屬性為該類所有,而非該類實例化的對象所有,在類的加載階段進行初始化。雖然使用類實例化的對象也能夠調(diào)用該屬性,但是該屬性是屬于類所有,所有該類的實例化對象和該類共享一個值,即操作的是同一個值。
public class Person{ static int age; static int high = 175; public static void main(String[] args){ System.out.println(age); System.out.println(high); } } class PersonTest{ public static void main(String[] args){ System.out.println(Person.age); } }
成員變量不給初始值的話,會進行默認初始化。
被static修飾的屬性,可以認為是屬于類的,只要類進行加載以后,便可以使用類名.屬性名
進行調(diào)用。
修飾成員方法
被static關(guān)鍵字修飾的方法叫做類方法,修飾后的方法可以直接使類名.方法名
調(diào)用,減少了實例化對象進行調(diào)用的資源消耗。
簡單的來說被static修飾的方法,可以認為是屬于類的,只要類進行加載以后,則就可以進行使用。
public class Person{ static int age; static int high = 175; public static void seeMessage(String msg){ System.out.println(msg); } } class PersonTest{ public static void main(String[] args){ Person.seeMessage("Hello Codermast!"); } }
這里需要注意的是一個靜態(tài)方法是不能夠直接調(diào)用同類下的非靜態(tài)方法,而同類下的非靜態(tài)方法則可以調(diào)用同類下的靜態(tài)方法。
修飾內(nèi)部類
被static修飾的內(nèi)部類完全獨立于其所在的外部類,不屬于外部類的對象,可以認為兩個類是完全沒有關(guān)系的兩個類。
- 靜態(tài)內(nèi)部類可以包含靜態(tài)成員,也可以包含非靜態(tài)成員,但是在非靜態(tài)內(nèi)部類中不可以聲明靜態(tài)成員。
- 靜態(tài)類內(nèi)部不可以訪問外部類的實例成員,只能訪問外部類的類成員,即使是靜態(tài)內(nèi)部類的實例方法也不能訪問外部類的實例成員,只能訪問外部類的靜態(tài)成員
- 外部類不可以定義為靜態(tài)類,Java中靜態(tài)類只有一種,那就是靜態(tài)內(nèi)部類,頂級類不能用static 修飾
外部類如何調(diào)用靜態(tài)內(nèi)部類的屬性和方法:
- 外部類可以通過創(chuàng)建靜態(tài)內(nèi)部類實例的方法來調(diào)用靜態(tài)內(nèi)部類的非靜態(tài)屬性和方法
- 外部類可以直接通過“ 外部類.內(nèi)部類.屬性(方法)” 的方式直接調(diào)用靜態(tài)內(nèi)部類中的靜態(tài)屬性和方法
創(chuàng)建一個靜態(tài)內(nèi)部類實例:
- 在外部類中:直接使用類名創(chuàng)建即可,
內(nèi)部類名 name = new 內(nèi)部類構(gòu)造器;
- 在其他類中:使用
外部類.內(nèi)部類 name = new 外部類.內(nèi)部構(gòu)造器;
靜態(tài)代碼塊
static修飾代碼塊的作用就是,在類加載以后進行執(zhí)行這段代碼。我們需要著重看一下具體的執(zhí)行順序。下面是一個簡單的示例。
class Dog { String name; public Dog(String name) { this.name = name; System.out.println("狗的名字叫:" + name); } } class Person { String name; public Person(String name){ this.name = name; System.out.println("人的名字叫:" + name); } static int age = 18; static { System.out.println("靜態(tài)代碼塊1執(zhí)行..."); } static Dog xiaohuang = new Dog("小黃"); Dog xiaohua = new Dog("小花"); static { System.out.println("靜態(tài)代碼塊2執(zhí)行..."); } static int high = 175; Dog xiaohei = new Dog("小黑"); static Dog xiaobai = new Dog("小白"); public static void main(String[] args) { Person person = new Person("codermast"); } }
該示例執(zhí)行后的結(jié)果如下所示:
則我們可以判斷出執(zhí)行的順序為:
- 靜態(tài)代碼塊和靜態(tài)屬性的順序執(zhí)行
- 非靜態(tài)屬性的執(zhí)行
- 方法的調(diào)用
這里主要解釋第一點,靜態(tài)代碼塊和靜態(tài)屬性屬于同一優(yōu)先級,順序執(zhí)行。舉個簡單的例子即可理解:
這里我們就無法調(diào)用到age屬性
靜態(tài)導(dǎo)包
靜態(tài)導(dǎo)包用法,將類的方法直接導(dǎo)入到當前類中,從而直接使用“方法名”即可調(diào)用類方法,更加方便。
- PrintMsg類
public class PrintMsg{ public static void printMsg(String msg){ System.out.println(msg) } }
- Test類
import static codermast.util.PrintMsg.*; public class Test{ public static void main(String[] args){ printMsg("hello codermast!") } }
運行Test類中的main方法后,就能在控制臺看到“hello codermast!”的一行輸出。
需要注意的是:導(dǎo)入的靜態(tài)方法所處的類,不能和調(diào)用的類在同一個包下。
到此這篇關(guān)于Java中Static關(guān)鍵字的五種用法詳解的文章就介紹到這了,更多相關(guān)Java中Static用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PowerJob的CleanService清理服務(wù)流程
這篇文章主要為大家介紹了PowerJob的CleanService清理服務(wù)流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>2024-02-02SpringBoot配置使Mybatis打印SQL執(zhí)行時的實際參數(shù)值操作
這篇文章主要介紹了SpringBoot配置使Mybatis打印SQL執(zhí)行時的實際參數(shù)值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12使用Springboot封裝一個自適配的數(shù)據(jù)單位轉(zhuǎn)換工具類
我們在接收前臺傳輸?shù)臄?shù)據(jù)時,往往SpringBoot使用內(nèi)置的數(shù)據(jù)類型轉(zhuǎn)換器把我們提交的數(shù)據(jù)自動封裝成對象等類型,下面這篇文章主要給大家介紹了關(guān)于使用Springboot封裝一個自適配的數(shù)據(jù)單位轉(zhuǎn)換工具類的相關(guān)資料,需要的朋友可以參考下2023-03-03