1. 程式人生 > >Java之路:this關鍵字的用法

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呼叫構造方法必須也只能放在類中。