天天看點

還不懂this關鍵字?一分鐘徹底弄懂this關鍵字

作者:Coder小哥

大家有沒有考慮過,在一個類的構造器中,我們為什麼要使用this.屬性而不直接使用屬性呢?畢竟一個類中,不管屬性被什麼關鍵字修飾,在類中都可以通路。随着這個問題,今天帶大家深入分析一下Java中this關鍵字,讓大家徹底了解this關鍵字.

構造器中的this

1.1初識this:

public class Account {
    private String name;
    private double balance;
    private String pwd;
	
	//Account類的一個構造器
	public Account (String name,double balance,String pwd){
		//構造器的實作---初始化對象
		this.name = name;
		this.balance = balance;	
		this.pwd = pwd;
	}
}
           
  • 【思考】:不用this會怎麼樣?
class Account {
    private String name;
    private double balance;
    private String pwd;

    //Account類的一個構造器
    public Account(String name, double balance, String pwd) {
        //構造器的實作---初始化對象
        //不用this
        name = name;
        balance = balance;
        pwd = pwd;
    }

    public void showInfo() {
        System.out.println("name:" + name + " " + "balance:" + balance + " " + "pwd:" + pwd);
        return;
    }
}

public class Main {
    public static void main(String[] args) {
        Account account = new Account("Yaoyao", 20, "123456");
        account.showInfo();
    }
}
           

【運作結果】:

還不懂this關鍵字?一分鐘徹底弄懂this關鍵字

【解釋】:

  • 我們以為左邊的變量是成員變量,但實際上,左邊變量是局部變量!即,局部變量指派給了局部變量,成員變量根本沒變,依舊是預設值!
還不懂this關鍵字?一分鐘徹底弄懂this關鍵字
  • 方法中的變量為局部變量,存儲在棧中,作用範圍是方法内;我們想通過構造器初始化的是成員變量,存儲在堆中,作用範圍是本類内部。

    當成員變量&局部變量重名時,優先使用局部變量。關鍵還是看有沒有局部變量,有局部變量優先使用局部變量,否則屬性—就近原則!

還不懂this關鍵字?一分鐘徹底弄懂this關鍵字
還不懂this關鍵字?一分鐘徹底弄懂this關鍵字

1.2:為何要this?

 通過上面的分析,我們發現,當局部變量&屬性同名時,在構造器中無法對屬性初始化成功。我們在想,如果能被指派的變量,不是構造器中的局部變量,而是成員變量這個問題不就解決了嘛?對的,是以就有了this!!!

public class Account {
    private String name;
    private double balance;
    private String pwd;
	
	//Account類的一個構造器
	public Account (String name,double balance,String pwd){
		//構造器的實作---初始化對象
		this.name = name;
		this.balance = balance;	
		this.pwd = pwd;
	}
}
           

這樣,通過this.屬性來表明這是一個成員變量,與局部變量以示區分.

this介紹

2.1:this到底是什麼?

  • 比較官方的解釋:

this其實可以了解為對象的一個屬性(成員變量),但是這個屬性是隐藏的.即this相當于對象的一個隐藏屬性。

和對象的其他屬性一樣,在new一個新對象的時候,會在堆記憶體為對象配置設定空間,屬性就儲存在這份空間中。且該this屬性的值就是對象在堆記憶體中位址,即this指向該對象(this代表該對象).

【重點】綜上:this是對象的隐藏屬性(本質就是一個普通的成員變量),和其他non-static屬性一樣,在建立對象的時候會為每個新對象配置設定該對象的專屬成員變量(this就是其中一個),this這個成員變量存儲在堆記憶體中,該變量的值是所屬對象在堆記憶體的位址。

即:建立1000個對象,就有1000個this,它們之間互相獨立(哎呀,this就是普通的成員變量而已啦!)

還不懂this關鍵字?一分鐘徹底弄懂this關鍵字

使用細節&注意事項

this關鍵字可以用來區分目前類的屬性&局部變量。

使用this關鍵字可以用來通路本類的執行個體屬性、執行個體方法、構造器(“執行個體”指的就是non-static修飾 的)

通路本類執行個體屬性:this.屬性

通路本類執行個體方法:this.方法名(參數清單)

通路本類構造器:this(參數清單)

【注意】:this(參數清單)來通路本類構造器需要注意以下幾點

隻能在構造器中使用this(參數清單);即在一個構造器中通路本類的另外一個構造器。(預設構造器行首是super();,)。

顯示使用this()時,預設的super()就被覆寫

this(參數清單)和super(參數清單)在構造器中有且隻能存在一個。

若在構造器中使用this(參數清單),則此語句隻能位于構造器第一行

類中的靜态方法static method中不能使用this。很簡單了解:static方法中不能出現成員變量(this依賴對象,而static不依賴于對象,類名.靜态方法時,沒有對象啊,你讓this情何以堪!它都不知道自己屬于哪個對象!)

繼續閱讀