Java中static修飾的靜態(tài)變量、方法及代碼塊的特性與使用
前言
static關(guān)鍵字表示“靜態(tài)的”,可以用來(lái)修飾類的變量、成員方法和代碼塊等。
被其修飾的類成員具有一些特殊性,下面將介紹static所修飾的靜態(tài)變量、靜態(tài)方法和靜態(tài)代碼塊的特性和用法。
一、靜態(tài)變量
一個(gè)類通過(guò)使用new關(guān)鍵字可以創(chuàng)建多個(gè)不同的對(duì)象,而不同的對(duì)象實(shí)例將被分配到不同的內(nèi)存空間。
但在一些特殊情況下,我們也會(huì)希望某些特定的數(shù)據(jù)在內(nèi)存中只有一份,但能夠被一個(gè)類中的所有對(duì)象實(shí)例所共享。
在java中,類的成員變量有兩種:
①:被static修飾的變量,即類變量(靜態(tài)變量),
在類加載的時(shí)候就完成內(nèi)存空間的分配,在內(nèi)存中占用一份備份,同時(shí)也只分配一次內(nèi)存,供其他的實(shí)例對(duì)象訪問(wèn)(共享)。
可以直接通過(guò)類名.變量名或對(duì)象名.變量名的方式來(lái)訪問(wèn)。
//通過(guò)類名訪問(wèn)靜態(tài)變量 //類名.靜態(tài)成員變量 Demo.country="中國(guó)"; System.out.println(Demo.country);
//通過(guò)對(duì)象名訪問(wèn)靜態(tài)成員變量 //對(duì)象名.靜態(tài)成員變量 demo1.country="美國(guó)"; System.out.println(Demo.country);
②:沒被static修飾的變量,即實(shí)例變量,
每實(shí)例化一次就會(huì)為其分配一次內(nèi)存,可能存在多次分配內(nèi)存空間,
且必須通過(guò)對(duì)象名.變量名的方法來(lái)訪問(wèn)。
demo1.name="張三"; //通過(guò)對(duì)象名訪問(wèn)非靜態(tài)變量 System.out.println(demo1.name);
若堅(jiān)持使用類名.變量的方式來(lái)訪問(wèn),則會(huì)出現(xiàn)以下錯(cuò)誤,
原因是此處的變量還沒有經(jīng)過(guò)實(shí)例化,就直接拿來(lái)訪問(wèn)了。
關(guān)于靜態(tài)變量,需要注意以下問(wèn)題:
static只能修飾成員變量,不能修飾局部變量
因?yàn)榫植孔兞看藭r(shí)還沒有實(shí)例化,沒有分配內(nèi)存空間,而static在類加載時(shí)就要分配空間。
二、靜態(tài)方法
被static修飾的方法被稱為靜態(tài)方法。
與上文中的靜態(tài)變量一樣,訪問(wèn)靜態(tài)方法也不需要?jiǎng)?chuàng)建類的實(shí)例,可直接通過(guò)類名來(lái)訪問(wèn);
若已經(jīng)創(chuàng)建 了對(duì)象,也可以通過(guò)對(duì)象引用來(lái)訪問(wèn)。
靜態(tài)方法可以通過(guò)類名.方法名或者對(duì)象名.方法名兩種方式來(lái)調(diào)用靜態(tài)方法。
關(guān)于靜態(tài)變量,需要注意兩點(diǎn):
①:靜態(tài)方法只能訪問(wèn)類中用static修飾的成員。
靜態(tài)方法可以通過(guò)類名來(lái)調(diào)用,且在調(diào)用時(shí)可以不創(chuàng)建任何對(duì)象,而沒有被static修飾的從成員需要先創(chuàng)建對(duì)象才能訪問(wèn)。
//類變量,代表人的國(guó)籍 static String country; //實(shí)例變量,代表人的姓名 String name; //靜態(tài)方法 static void printInfo() { System.out.println("Person的國(guó)籍是:"+country); //System.out.println(name); 錯(cuò)誤!??! }
若在靜態(tài)方法,訪問(wèn)了類中非static修飾的成員,則會(huì)出現(xiàn)以下錯(cuò)誤:
②:靜態(tài)方法不能以任何方式引用this和super關(guān)鍵字。
靜態(tài)方法可以通過(guò)類名直接調(diào)用,這時(shí),可能還沒有任何對(duì)象產(chǎn)生。
所以,代表當(dāng)前對(duì)象的this和代表父類對(duì)象的super都是不存在的。
三、靜態(tài)代碼塊
在Java程序中,代碼塊就是用一對(duì)大括號(hào)括起來(lái)的若干行代碼。
而所謂的靜態(tài)代碼塊就是用static關(guān)鍵字修飾的代碼塊。
在程序中,通常使用靜態(tài)代碼塊來(lái)對(duì)類的靜態(tài)成員變量就行初始化。
class A { static int id; //靜態(tài)代碼塊 static { id=100; } }
需要注意的是,類的靜態(tài)代碼塊不可以訪問(wèn)類的非靜態(tài)成員。
當(dāng)類加載時(shí),其靜態(tài)成員代碼塊也將同步執(zhí)行,且由于類只加載一次,故靜態(tài)成員代碼塊也只執(zhí)行一次。
非靜態(tài)代碼塊在實(shí)例化對(duì)象時(shí)會(huì)被多次執(zhí)行。
先后順序如下:
靜態(tài)代碼塊 > 普通代碼塊>無(wú)參構(gòu)造方法
到此這篇關(guān)于Java中static修飾的靜態(tài)變量、方法及代碼塊的特性與使用的文章就介紹到這了,更多相關(guān)Java static修飾符的特性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何結(jié)合kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2024-01-01基于springboot微信公眾號(hào)開發(fā)(微信自動(dòng)回復(fù))
這篇文章主要介紹了基于springboot微信公眾號(hào)開發(fā)(微信自動(dòng)回復(fù)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11java使用dbcp2數(shù)據(jù)庫(kù)連接池
這篇文章主要為大家詳細(xì)介紹了java使用dbcp2數(shù)據(jù)庫(kù)連接池的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10Java中wait與sleep的區(qū)別講解(wait有參及無(wú)參區(qū)別)
這篇文章主要介紹了Java中wait與sleep的講解(wait有參及無(wú)參區(qū)別),通過(guò)代碼介紹了wait()?與wait(?long?timeout?)?區(qū)別,wait(0)?與?sleep(0)區(qū)別,需要的朋友可以參考下2022-04-04SpringBoot+Redis隊(duì)列實(shí)現(xiàn)Java版秒殺的示例代碼
本文主要介紹了SpringBoot+Redis隊(duì)列實(shí)現(xiàn)Java版秒殺的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06