關於Java中static和this關鍵字
深入探究static與this
static關鍵字
在我們開始研究一個事物的時候,我們首先要問一句,為什麼?
所以,為什麼要有static關鍵字呢?
如果,我們把中國人抽象為java的一個類,那麼這個類中就必然存在一些成員屬性。假定中國人這個類中有國籍,身份證號碼。我們都知道每個人的身份證都不同,但是我們每個中國人的國籍都相同,都是中國
附上程式碼
public class Chinese{
private int id ;
private String conturyName ;
}
每當我們通過 new 關鍵字,先後在JVM的堆記憶體空間和棧記憶體空間(讀到方法時,入棧)開闢一個空間時,我們都要對這個物件進行賦值操作。
建立了李四賦值為(222,“China”)
附上程式碼
public class Chinese{
private int id ;
private String conturyName ;
public void setId(int cid){
id = cid ;
}
public int getId(){
return id;
}
public void setName(String name ){
conturyName = name ;
}
public String getName (){
return conturyName ;
}
}
public class ChineseTest{
public static void main(String []args){
Chinese zs = new Chinese();
zs.setId(111);
System.out.println(zs.getId());
zs.setName("China");
System.out.println(zs.getName());
System.out.println("-------------------" );
Chinese ls = new Chinese();
ls.setId(222);
System.out.println(ls.getId());
ls.setName("China");
System.out.println(ls.getName());
}
}
執行截圖
那我們如果要將1w個的中國人的身份證和國籍輸入到系統中,那我們就需要進行“China”(這個每個物件具有相同值的)1萬次的賦值操作。這樣很浪費空間,加大了記憶體的開銷。
所以,既然中國人的國籍都是“China”,那為什麼不獨立出來共同使用呢?這樣我們就不需要進行重複的賦值操作了。
此時,static便應運而生了
那麼static產生的變數將會存放在哪呢?
我們知道JVM主要有三大記憶體空間
棧記憶體空間、堆記憶體空間、方法區記憶體空間
static關鍵字產生的變數叫static變數,與區域性變數和成員變數不一致。
靜態變數不存放與堆記憶體空間中(區域性變數),也不存放於棧記憶體空間中(成員變數),因此只存在於方法區記憶體空間中
圖示表示為
記憶體空間 | 存放變數 |
---|---|
棧記憶體空間 | 區域性變數 |
堆記憶體空間 | 成員變數 |
方法區記憶體空間 | 靜態變數 |
方法區記憶體
方法區記憶體主要存放
程式碼片段的位元組碼檔案(.class)、靜態的資料和常量
是JVM種最先載入的一塊記憶體空間(甚至先於main()方法執行)
在載入的過程中,遇到靜態的變數,就會將在這個空間中開闢空間儲存並賦值
這無疑大幅度的減少了記憶體的開銷,並提高了程式執行的效率
既然如此,那我們什麼時候可以使用static呢?
只有當該類中每一個物件都具有相同值的時候才能使用,也就是說這是屬於類級別的變數(與之對應的是成員變數),其引用方法為“類名.”來訪問(適用於靜態的變數或者方法)
this關鍵字
this 意為 這個
同樣的,我們需要問一下
為什麼要有this關鍵字?
在解釋之前,我們來看一段程式碼
public class This{
private int id ;
public This(int id){
id = id ;
}
public String toString(){
return "{" + id + "}" ;
}
}
public class ThisTest{
public static void main(String []args){
This t = new This(1);
System.out.println(t);
}
}
執行結果
分析:
我們在ThisTest類中明明給id賦值為1,可是結果卻是0,為什麼?
這就涉及到java中的就近原則,也就是說
public This(int id){
id = id ;
}
這個等號左邊的id為形參中的id
等號右邊id 也為形參中的id
也就是說,我們並沒有更改這個This類中的id的值!!!
而當我們用上this關鍵字時
public This(int id){
this.id = id ;
}
結果變成了我們想要的“1”。
此時:
等號左邊的this.id為構造方法中傳入的id
等號右邊的id 為 This類中的成員屬性id