1. 程式人生 > >Java初學之this關鍵字原理圖解

Java初學之this關鍵字原理圖解

說起this關鍵字大家應該都不陌生

我們先來回顧一下this關鍵字。

1.this關鍵字主要有三個應用:
 (1)this呼叫本類中的屬性,也就是類中的成員變數;
 (2)this呼叫本類中的其他方法;
 (3)this呼叫本類中的其他構造方法,呼叫時要放在構造方法的首行。

我們今天先來了解第一個應用。

首先看一段程式碼

class Person
{
	private String name;
	private int age;
	Person(String name)
	{
		this.name=name;
	}
	public void speak()
	{
		System.out.println(name+":"+age);
	}
}

class Demo{
	public static void main(String[] args)
	{
		Person p=new Person("haha");
		p.speak();
		Person p1=new Person("xixi");
		p1.speak();	
	}

}
初學者肯定有很多疑問,比如我自己:

p,p1都呼叫建構函式,那麼初始化的時候,它們怎麼能分清p的name是個p,而不是給p1

所以我們畫個原理圖來了解一下內部原理。

首先當new一個物件時候,p入棧,建構函式在堆中開闢了一塊記憶體,如圖:


這個時候,怎麼把p和堆中的記憶體聯絡起來?這個時候this的作用就出來了。


後面會new很多物件,那麼有了this後,誰呼叫建構函式就個誰初始化,用this作為判斷依據。this指向哪個物件就給那個物件初始化。


所以p就找到了那塊記憶體空間,然後彈棧,speak()函式進棧,出棧。p1同理也是這樣的。

這個時候有人也許會問,那怎麼判斷speak()是哪個物件呼叫呢?

public void speak()
	{
		System.out.println(name+":"+age);
	}
這段程式碼起始隱藏了東西
public void speak()
	{
		System.out.println(this.name+":"+this.age);
	}
看圖


還是通過this,speak指向了p這個物件。

在speak()中,並沒定義name,age區域性變數,使用的物件裡面的,所以隱藏了一個this,沒有重名就可以省略。

講到這裡是不是一目瞭然了?