this 在 Java 中的作用是指向對象的引用,根據 this 所在位置不同,其主要引用方式分爲兩種情形:
- 構造器中引用構造器中初始化的對象;
- 在方法中引用調用該方法的對象
this 最大作用就是讓類中的一個方法訪問的另一個方法或實例變量;
public class DogText {
//定義一個 jump 方法
public void jump()
{
System.out.println("正在執行 jump 方法!");
}
public void run()
{
//調用 jump 方法,構造器初始化;
DogText d = new DogText();
d.jump();
System.out.println("正在執行 Run 方法");
}
public static void main(String[] args)
{
DogText d = new DogText();
d.run();
}
}
在上面例子中,在 run() 方法中方調用類中的 jump() 方法,這裏用的是創建 DogText 對象來調用該方法,但是在主函數 main() 函數中,又創建了一次 DogText 對象引用;
以上的調用方式可以正常運行,但這樣代碼運行方式是:1,第一個方法 run() 內調用其他方法(例如 jump() 方法)必須需要創建一個 DogText() 對象麼?2,是否必要重新創建一個 DogText() 對象?
對於第一個問題是肯定的,調用一個非 static 修飾的方法必須用對象,所以需要創建一個新的對象,2,不一定,因爲在主函數 run()調用時已經創建好了一個 對象,繼續使用時可直接調用就 OK 了。
run() 方法調用 jump() 方法,可直接可以利用在 run() 獲得該方法的對象,用關鍵詞 this 即可滿足
public void run()
{
//this 引用調用 run()的對象
this.jump();
System.out.println("正在執行 Run 方法");
}
而在 java 中是允許 類中一個方法直接調用另一個方法,可以省略 this 前綴,因此 run() 方法可以改寫爲:
public void run()
{
//this 引用調用 run()的對象
this.jump();
System.out.println("正在執行 Run 方法");
}
大部分時候,一個方法調用另一個方法、實例變量加不加 this 效果一樣的;雖然 this 省略了,但前面調用方法的對象是依然存在的;
這裏需要注意一點的是用 static 修飾的方法 不能使用 this 關鍵字,因爲這個關鍵詞無法指向合適的對象;所以 static 修飾的方法不能使用 this 引用,只能對象調用,也就造成了 java中的一個語法規定;靜態成員不能直接訪問靜態成員;
案例如下:
public class DogText {
//定義一個 jump 方法
public void jump()
{
System.out.println("正在執行 jump 方法!");
}
public void run()
{
//調用 jump 方法,構造器初始化;
DogText d = new DogText();
d.jump();
System.out.println("正在執行 Run 方法");
}
public static void main(String[] args)
{
//run() 程序報錯,無法從靜態上席文引用非靜態
DogText d = new DogText();
d.run();
}
}
小總結
以上就是 this 關鍵詞的一些用法, 大概總結下來就兩點:
- 1,一般情況,類中的方法可直接調用另一種方法、成員變量;this 可加可不加,引用的是對象;
- 2,static 修飾方法不可調用非 static 修飾方法,需構造器構造一個新的對象再進行調用。
文章首發於公衆號 Java開發愛好者