Java之路:this關鍵字的用法
(1)this代表當前物件的一個引用。所謂當前物件,指的是呼叫類中方法或屬性的那個物件。
最經常使用this關鍵字的情況,是在物件的一個屬性被方法或構造器的引數遮蔽時,需要呼叫這個被遮蔽的屬性,如下:
class Person {
private String name;
private int age;
public Person(String name, int age) {
// 區域性變數name,age把Person類的屬性遮蔽
this.name = name;
this.age = age;
}
}
(2)this只能在方法內部使用,表示對“呼叫方法的那個物件”的引用。但要注意,如果在方法內部呼叫同一個類的另一個方法,就不必使用this,直接呼叫即可。當前方法中的this引用會自動應用於同一類中的其他方法。
如下:
public class Apricot {
void pick() {}
void pit() {
pick();
}
}
在pit()內部,你可以寫this.pick(),但無此必要。編譯器能幫你自動新增。只有當需要明確指出對當前物件的引用時,才需要使用this關鍵字。
注:有些人執意將this放在每一個方法呼叫和欄位引用前,認為這樣“更清楚更明確”。但是造成別這樣做。我們使用高階語言的原因之一就是它們能幫我們做一些事情。要是你把this放在一些沒必要的地方,就會使讀你程式的人不知所措,因為別人寫的程式碼不會到處用到this。人們期望只在必要處使用this。遵循一種一致而直觀的程式設計風格能節省時間和金錢。
(3)this不能用於靜態方法。main方法也是靜態的,所以this也不能用於main方法。
Static方法是類方法,先於任何的例項(物件)存在。即Static方法在類載入時就已經存在了,但是物件是在建立時才在記憶體中生成,而this指代的是當前的物件。
在方法中定義使用的this關鍵字,它的值是當前物件的引用。也就是說你只能用它來呼叫屬於當前物件的方法或者使用this處理方法中成員變數和區域性變數重名的情況.。
而且,更為重要的是this和super都無法出現在static 修飾的方法中,static 修飾的方法是屬於類的,該方法的呼叫者可能是一個類,而不是物件。如果使用的是類來呼叫而不是物件,則this就無法指向合適的物件。所以static 修飾的方法中不能使用this。
(4)可以使用this關鍵字呼叫過載構造方法。避免相同的初始化程式碼,只能在構造方法中用,並且必須位於構造方法的第一句。並且,除了構造器之外,編譯器禁止在其他任何方法中呼叫構造器。
package this_constructor;
class Person {
String name;
int age;
public Person() {
System.out.println("Person() constructor!");
}
public Person(String name, int age) {
this(); // 呼叫本類中無參構造方法
this.name = name;
this.age = age;
System.out.println("Person(String name, int age) constructor!");
}
}
public class ThisConstructor {
public static void main(String[] args) {
{
new Person("小光", 25);
}
}
}
【結果】
再看下例:
public class Rectangle {
private int x, y;
private int width, height;
public Rectangle() {
this(0, 0, 0, 0); // 呼叫當前物件帶有四個引數的構造器
}
public Rectangle(int width, int height) {
this(0, 0, width, height);
}
public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
...
}
有的讀者經常會有這樣的疑問,如果我把this()呼叫無參構造方法的位置任意調換,那不就可以在任何時候都可以呼叫構造方法了麼?實際上這樣理解是錯誤的。構造方法是在例項化一個物件時被自動呼叫的,也就是說在類中的所有方法裡,只有構造方法是被優先呼叫的,所以使用this呼叫構造方法必須也只能放在類中。