java中this關鍵字

Hello_ word發表於2020-12-09

1、我們瞭解this作用之前,先了解this是什麼?在記憶體方面是怎樣的?

  • 其實呢this是個變數,是個引用,儲存當前物件的記憶體地址,指向自身。this代表的就是“當前物件”;它是儲存在堆記憶體中當前物件的內部
  • 一個物件一個this

在記憶體中的存在:
在這裡插入圖片描述
需要注意的是圖中只畫了類中的一個物件。我們再建立個物件,也是一樣的,this還在物件內部,只不過這個物件的地址改變了而已,當然this所指的地址也會改變,假如這裡我們建立了個物件為c2,那this所指的地址和c2也是一樣的,這個物件地址是什麼,this所指的地址就是什麼。

2、this只能使用在例項方法中,誰呼叫這個例項方法,this就是誰,所以this代表的是:當前物件,這裡我們定義了一個People類,並對屬性進性封裝,已經構造方法:

public class PeopleTest{
	public static void main(String[] args){
		People people = new People();
		people.setName("李四");
		System.out.println(people.getName);
	}
}
 class People {
    private String name;

    public People() {
    }

    public People(String name) {
        this.name = name;
    }
	
    public String getName() {
        return name;
    }
	
	/*public void setName(String c){
		 name = c;		
	  }
	  public void setName(String name){
		 name = name;
	  }
	 */ 
    public void setName(String name) {
        this.name = name;
    }
}

我們只對get和set方法進行解釋,構造方法中也是同樣的;
<1>、我們可以看到兩種set方法都可以傳入引數,可對name進行修改,可是第一種傳入String c明顯的不合適,這個c到底是什麼,我們很明確的知道,我們需要傳入的name,這樣傳參肯定會造成誤解
<2>、而第二種使用 name = name的方式,這樣編譯器會直接給警告,由於java語言的就近原則,這個區域性變數name傳入的就不是例項變數name,我們執行起來,可以發現並沒有對例項變數name進行賦值;
<3>、接下來也是最平常的set方法,this.name = name;在第二種name = name的方式中並沒對例項變數name進行賦值,主要是是沒有物件的參與,setget方法都是例項方法,那我們就在需要賦值的例項變數前加this. 的方法,這樣表示當前物件的name,我們再測試類中建立物件,呼叫set方法,就知道了當前的物件是people,形象的說this.name 就相對於people.name了,只要建立物件對例項變數name進行賦值,this都會指向當前物件,建立一個people物件那麼這個name就是people物件的,建立一個animal物件那這個name就是animal物件的name

3、 有的時候this也是可以省略的,我們再來看一種情況,再上面的程式當中加入跑步的方法。

 public void run(){
        System.out.println(name+"在跑步");
    }

這裡的name裡並沒有this,按理來說應該有物件的參與,通過引用. 的方式來訪問name,不過這裡把this省略了而已,我們不省略this也是可以的

 public void run(){
        System.out.println(this.name+"在跑步");
    }

這樣也可正常執行,在我們建立物件呼叫run()方法,run()就已經知道預設呼叫它的是該物件,所以這裡的this也就會被省略。

4、this代表當前物件,靜態方法中不存在當前物件。

static關鍵字修飾的變數是靜態變數,修飾的方法是靜態方法,靜態方法的呼叫不許要物件的建立,直接使用類名.方法名的方式訪問,static關鍵字再之前的部落格也進行了詳細解釋。我們再把之前的run()方法該文靜態的方法,
在這裡插入圖片描述
這裡name就出現錯誤提示了,因為靜態方法中不需要物件的參與,我們這裡的name物件參與的,應該是this.name的格式,只不過我們把this省略了,如果我們需要呼叫這個name,就需要建立物件來呼叫
如圖
在這裡插入圖片描述

通過上述的幾個例子當中國可以發現:在例項方法中,或者構造方法中,為了區分區域性變數和例項變數,這種情況下this是不能省略;

6、this()

我們來看接下來的題目要求,就之前的日期類,有兩個構造方法,無參和有參的,需要再無參的構造方法中進行初始化賦值,分別是1970年1月1日;我們來看程式碼片段:
在這裡插入圖片描述
這樣寫完全沒沒問題,接下來我們對程式碼進行優化:
在這裡插入圖片描述
通過this呼叫本類的構造方法,這樣方便了很多
結論:
this除了使用在例項方法中,也可以使用在構造方法中;通過當前的構造方法去呼叫另一個本類的構造方法,
但是在呼叫無參構造方法是,只能呼叫本類的構造方法,並且this()只能出現在無參構造方法的第一行;

相關文章