前言
this關鍵字屬於Java中比較復雜的關鍵字之一,若是學習過C++或者其他的一些面向對象語言也會遇到this這個關鍵字並且都會看到this的含義就是表示當前對象。下面將介紹this所表示的當前對象的含義,以及this在Java中的一些用法。
this調用屬性
當我們寫帶參構造函數時,會傾向於將形參名取與將要賦值的屬性名相同,這樣就更容易看見形參就知道它是給哪個屬性賦值。
class Student{
private String name;
private int age;
public Student(String name, int age){
}
}
在構造函數中賦值的時候,會很容易寫成下面這樣:
class Student{
private String name;
private int age;
public Student(String name, int age){
name = name;
age = age;
}
}
若寫成這樣,當構造Student這個對象並輸出該對象的姓名和年齡時會發現,name為null, age為0。
造成這樣的原因是因為有局部可見性。通常使用{}括起來的一個數據塊叫做一個作用域范圍。在同一個作用域范圍定義了兩個同名的變量則會報錯;若是在該作用域定義了一個與該作用域范圍之外同名的變量則是可以的,在這個作用域同時使用這兩個變量,則在這個作用域中定義的變量會屏蔽作用域范圍之外的那個變量,即在該作用域中定義的變量才會有效。
簡單來說,在同一作用域內,作用范圍小的變量會屏蔽同名的作用范圍大的變量。
若是想要Student類中的屬性可以被正確初始化,那么則需要使用this關鍵字。
class Student{
private String name;
private int age;
public Student(String name, int age){
this.name = name;
this.age = age;
}
}
this調用方法
this不僅可以調用類中的屬性還可以調用類中的方法。
類中的方法有普通方法和構造方法。
-
在本類的普通函數中調用其他普通函數,可以在函數前面加上this也可以不加。(一般不用加上)
-
普通方法中不可以調用構造函數,構造函數的調用只能出現在第一次創建對象為對象進行初始化時調用。
-
在構造函數中調用普通方法,一般不推薦調用在方法內部使用了屬性的普通方法。因為構造函數還沒有執行完,屬性沒有被完全初始化,這時使用屬性可能會出現異常。
-
構造函數之間可以相互調用。構造函數之間相互調用一定要使用this關鍵字。這也是this的重要應用之一。使用
this()表示調用無參構造函數,this(arg1,...)表示調用帶參構造函數。
public class Student{
private String name = null;
private int age = 0;
public Student() {
System.out.println("Student():name="+name+",age="+age);
}
public Student(String name, int age) {
this(); //若使用Student()則會報錯:沒有定義這個方法。被當做普通方法來解釋
this.name = name;
this.age = age;
System.out.println("Student(String name, int age):name="+name+",age="+age);
}
public static void main(String[] args) {
Student stu = new Student("Sakura",20);
}
}
/*
output:
Student():name=null,age=0
Student(String name, int age):name=Sakura,age=20
*/
構造函數之間為什么要相互調用呢?
因為要減少構造函數中代碼的重復問題,提高代碼的重用性。所以,構造函數之間相互可以調用也就理所當然了。
構造函數之間相互調用有一些限制需要注意:
this()或者this(arg1, ...)需要被放在構造函數內部的首行。- 進行構造方法相互調用的時候,一定要保留調用的出口。
至少保留相互調用之間的一個構造函數沒有使用this調用其他構造函數,此構造函數作為出口。避免遞歸調用。
this表示當前對象
同一個類的不同對象,它們的屬性是屬於不同空間的,但卻共享類中的方法。所以它們需要一種方式表明是它們自己在調用該方法而不是其他的對象。
所以,當對象調用方法時,該對象會作為一個隱含實參傳入到非靜態方法中,在非靜態方法中使用this來指向它,表明是它在調用該方法。
查看下面例子,可以發現this就是指向的是當前正在調用類中方法的對象。

所以前面使用this.屬性也就很容易理解了,就是當前對象的屬性。
小結
簡單介紹了Java中的this關鍵字應用的幾個方面,其中最主要的應用在於構造器之間的相互調用。
參考:
[1] Eckel B. Java編程思想(第四版)[M]. 北京: 機械工業出版社, 2007
