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