更新時(shí)間:2020-11-18 17:20:34 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1407次
static是java語(yǔ)言中的關(guān)鍵字,表示“靜態(tài)的”,它可以用來(lái)修飾變量、方法、代碼塊等,修飾的變量叫做靜態(tài)變量,修飾的方法叫做靜態(tài)方法,修飾的代碼塊叫做靜態(tài)代碼塊。在java語(yǔ)言中凡是用static修飾的都是類相關(guān)的,不需要?jiǎng)?chuàng)建對(duì)象,直接通過(guò)“類名”即可訪問(wèn),即使使用“引用”去訪問(wèn),在運(yùn)行的時(shí)候也和堆內(nèi)存當(dāng)中的對(duì)象無(wú)關(guān)。本文主要來(lái)解析一下static關(guān)鍵字的深層原理。
要理解static關(guān)鍵字為什么會(huì)有上面的特性,首先我們還需要從jvm內(nèi)存說(shuō)起。我們先給出一張java的內(nèi)存結(jié)構(gòu)圖,然后通過(guò)案例描述一下static修飾的變量的存放位置。
從上圖我們可以發(fā)現(xiàn),靜態(tài)變量存放在方法區(qū)中,并且是被所有線程所共享的。這里要說(shuō)一下java堆,java堆存放的就是我們創(chuàng)建的一個(gè)個(gè)實(shí)例變量。
下面通過(guò)一個(gè)案例說(shuō)明一下,從內(nèi)存的角度來(lái)看,static關(guān)鍵字為什么會(huì)有這樣的特性。
首先我們定義一個(gè)類
public class Person {
//靜態(tài)變量
static String firstName;
String lastName;
public void showName(){
System.out.println(firstName+lastName);
}
//靜態(tài)方法
public static void viewName(){
System.out.println(firstName);
}
public static void main(String[] args) {
Person p =new Person();
Person.firstName = "小";
p.lastName="明";
p.showName();
Person p2 =new Person();
Person.firstName="阿";
p2.lastName="麗";
p2.showName();
}
}
//輸出。小明、阿麗
接下來(lái)我們從內(nèi)存的角度出發(fā),可以看出我們的方法在調(diào)用的時(shí)候,是從方法區(qū)調(diào)用的,但是堆內(nèi)存不一樣,堆內(nèi)存中的成員變量lastname是隨著對(duì)象的產(chǎn)生而產(chǎn)生。隨著對(duì)象的消失而消失。靜態(tài)變量是所有線程共享的,所以不會(huì)消失。這也就能解釋上面static關(guān)鍵字的真正原因。
我們?cè)谑褂檬褂胹tatic關(guān)鍵字時(shí)需要注意:
最后,我們看完了本文對(duì)static關(guān)鍵字的解析如果還有什么不明白的地方可以觀看本站的Java SE教程,里面對(duì)static關(guān)鍵字的講解更加全面透徹,讓你從無(wú)到有,快速掌握static關(guān)鍵字。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743