Java初學之this關鍵字原理圖解
阿新 • • 發佈:2019-02-20
說起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,沒有重名就可以省略。
講到這裡是不是一目瞭然了?