大家有沒有考慮過,在一個類的構造器中,我們為什麼要使用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();
}
}
【運作結果】:
【解釋】:
- 我們以為左邊的變量是成員變量,但實際上,左邊變量是局部變量!即,局部變量指派給了局部變量,成員變量根本沒變,依舊是預設值!
-
方法中的變量為局部變量,存儲在棧中,作用範圍是方法内;我們想通過構造器初始化的是成員變量,存儲在堆中,作用範圍是本類内部。
當成員變量&局部變量重名時,優先使用局部變量。關鍵還是看有沒有局部變量,有局部變量優先使用局部變量,否則屬性—就近原則!
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關鍵字可以用來通路本類的執行個體屬性、執行個體方法、構造器(“執行個體”指的就是non-static修飾 的)
通路本類執行個體屬性:this.屬性
通路本類執行個體方法:this.方法名(參數清單)
通路本類構造器:this(參數清單)
【注意】:this(參數清單)來通路本類構造器需要注意以下幾點
隻能在構造器中使用this(參數清單);即在一個構造器中通路本類的另外一個構造器。(預設構造器行首是super();,)。
顯示使用this()時,預設的super()就被覆寫
this(參數清單)和super(參數清單)在構造器中有且隻能存在一個。
若在構造器中使用this(參數清單),則此語句隻能位于構造器第一行
類中的靜态方法static method中不能使用this。很簡單了解:static方法中不能出現成員變量(this依賴對象,而static不依賴于對象,類名.靜态方法時,沒有對象啊,你讓this情何以堪!它都不知道自己屬于哪個對象!)