1. 程式人生 > 其它 >關於Java中static和this關鍵字

關於Java中static和this關鍵字

技術標籤:javajvm

深入探究static與this

static關鍵字

在我們開始研究一個事物的時候,我們首先要問一句,為什麼?

所以,為什麼要有static關鍵字呢?
如果,我們把中國人抽象為java的一個類,那麼這個類中就必然存在一些成員屬性。假定中國人這個類中有國籍,身份證號碼。我們都知道每個人的身份證都不同,但是我們每個中國人的國籍都相同,都是中國

附上程式碼

public class Chinese{
	private int id ;
	private String conturyName ;
}

每當我們通過 new 關鍵字,先後在JVM的堆記憶體空間和棧記憶體空間(讀到方法時,入棧)開闢一個空間時,我們都要對這個物件進行賦值操作。

我們建立了張三這個物件例項之後進行賦值(111,“China”)
建立了李四賦值為(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