Java中static與instance的區(qū)別及作用詳解
1.概念:
java中有個(gè)關(guān)鍵字叫static,翻譯為靜態(tài),用來修飾屬性和方法。它所修飾的屬性叫靜態(tài)屬性或類變量,修飾的方法叫靜態(tài)方法或者類方法。而沒有使用static修飾的屬性和方法就叫實(shí)例變量和方法,即instance翻譯為實(shí)例的意思。
2.static與instance的作用:
static實(shí)現(xiàn)了在同一個(gè)類的對象中共享數(shù)據(jù)。即同一個(gè)類中的不同對象都需要用到的屬性,就像一個(gè)班級類,它的每個(gè)學(xué)生對象都會(huì)用到班級名稱,是他們所共有的,每一個(gè)學(xué)生對象都共享這個(gè)班級名稱,就需要使用static來修飾。
而instance則是每個(gè)學(xué)生對象自己所獨(dú)有的屬性,例如每個(gè)學(xué)生對象都有自己的名字、身高、年齡等屬性就是instance修飾,但只有static才需要特別寫出來,instance就不用寫出來。
3.static修飾屬性和方法:
1.static修飾屬性(靜態(tài)變量):
static String className;
2.static修飾方法(靜態(tài)方法):
public static void getScore(){ }
4.instance屬性和方法:
1.實(shí)例屬性:
String name;
2.實(shí)例方法:
public void getScore(){ }
5.static與instance的區(qū)別:
1.加載時(shí)間不同:
- 靜態(tài)屬性和方法是在首次出現(xiàn)類名時(shí),為類的靜態(tài)屬性和方法分配內(nèi)存。
- 實(shí)例屬性和方法是類new對象的時(shí)候,為類的實(shí)例屬性和方法分配內(nèi)存。
2.份數(shù)不同:
- 靜態(tài)屬性和方法只有一份多個(gè)對象享用,而實(shí)例屬性和方法是有多少個(gè)對象就有多少份。
3.初始化方法不同:
靜態(tài)變量是除了通過定義時(shí)手動(dòng)確定外還可以通過static塊(靜態(tài)塊)來初始化。
例如:
static int age=0; //定義時(shí)手動(dòng)初始化。 //靜態(tài)塊,為static變量初始化,靜態(tài)塊在首次類名出現(xiàn)時(shí)調(diào)用,但后于分配靜態(tài)變量。 static{ age = 20; }
靜態(tài)塊:
類名首次出現(xiàn)時(shí),先為靜態(tài)變量分配內(nèi)存,然后調(diào)用靜態(tài)塊,靜態(tài)塊可以為靜態(tài)變量初始化。靜態(tài)塊只在類名首次出現(xiàn)時(shí)調(diào)用一次,以后再也不調(diào)用了。
- 動(dòng)態(tài)變量則是除了定義時(shí)手動(dòng)賦值外還通過構(gòu)造方法賦值(一般用構(gòu)造方法初始化)
例如:
String name= "張三"; //定義時(shí)手動(dòng)初始化。 Test(String name){ //帶一個(gè)參數(shù)的構(gòu)造方法。 this.name=name; } public static void main(String[] args) { Test t1=new Test("張三"); //通過構(gòu)造方法初始化。 }
4.內(nèi)存存放地址不同:
- 靜態(tài)變量被分配在方法區(qū)中,常駐內(nèi)存,永不回收。
- 實(shí)例變量被分配在堆中,用完回收。
5.調(diào)用方法不同:
- 靜態(tài)方法只可以調(diào)靜態(tài)方法和變量不可以調(diào)用實(shí)例方法和變量。
- 實(shí)例方法既可以調(diào)用實(shí)例變量和方法還可以調(diào)用靜態(tài)變量和方法。
原因:靜態(tài)方法是在首次出現(xiàn)類名時(shí)分配內(nèi)存調(diào)用的此時(shí)并不知道有沒有實(shí)例變量和方法。
案例分析:
public class Test { static int age; public static void main(String[] args) { age = 2; //此方法正確,都是靜態(tài)的,類名首次出現(xiàn)就分內(nèi)存 } }
public class Test { public static void main(String[] args) { } public void sayHello(){ } public static void sayHi(){ //報(bào)錯(cuò),不知道sayHello()有沒有 sayHello(); } }
public class Test { int age; public static void main(String[] args) { //報(bào)錯(cuò),不知道age屬性有沒有。 age = 2; } }
public class Test { int age; public static void main(String[] args) { //正確,創(chuàng)建對象new Test()調(diào)用屬性age表明已存在age屬性就能調(diào)用 new Test().age = 2; } }
以上就是Java中static與instance的區(qū)別及作用詳解的詳細(xì)內(nèi)容,更多關(guān)于Java static instance區(qū)別的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MyBatis動(dòng)態(tài)SQL之<choose><when><o(jì)therwise>標(biāo)簽的使用
MyBatis中動(dòng)態(tài)語句choose-when-otherwise 類似于Java中的switch-case-default語句,本文就來介紹一下MyBatis動(dòng)態(tài)SQL之<choose><when><o(jì)therwise>標(biāo)簽的使用,感興趣的可以了解一下2023-09-09Mybatis-Plus可能導(dǎo)致死鎖的問題分析及解決辦法
這篇文章給大家主要介紹了Mybatis-Plus可能導(dǎo)致死鎖的問題分析及解決辦法,文中通過代碼示例給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-12-12Java獲取兩個(gè)集合List的交集、補(bǔ)集、并集(相加)和差集(相減)的幾種方式
這篇文章主要介紹了Java獲取兩個(gè)集合List的交集、補(bǔ)集、并集(相加)和差集(相減)的幾種方式,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2025-04-04SpringBoot路徑映射實(shí)現(xiàn)過程圖解
這篇文章主要介紹了SpringBoot路徑映射實(shí)現(xiàn)過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Windows Zookeeper安裝過程及啟動(dòng)圖解
這篇文章主要介紹了Windows Zookeeper安裝過程及啟動(dòng)圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12