Java——this關鍵字
前言
this關鍵字屬於Java中比較複雜的關鍵字之一,若是學習過C++或者其他的一些面嚮物件語言也會遇到this這個關鍵字並且都會看到this的含義就是表示當前物件。什麼叫做表示當前物件?this在Java中的用法是怎樣的呢?將分為下面幾點介紹。
- this呼叫屬性
- this呼叫方法
- this表示當前物件
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()表示呼叫無參建構函式,this(引數,...)表示呼叫有參建構函式
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(引數,...)需要被放在建構函式內部的首行
-
進行構造方法相互呼叫的時候,一定要保留呼叫的出口!
至少保留相互呼叫之間的一個建構函式沒有使用this呼叫其他建構函式,此建構函式作為出口。避免遞迴呼叫!
this表示當前物件
我們需要知道同一個類的物件它們的屬性是屬於不同空間的 ,但是這些物件是共享類中的方法 。所以它們需要一種方式表明是它們自己在呼叫該方法而不是其他的物件。
所以,當物件呼叫方法時,該物件會作為一個隱含實參傳入到非靜態方法中,在非靜態方法中使用this來指向它,表明是它在呼叫該方法。
檢視下面例子,可以發現this就是指向的是當前正在呼叫類中方法的物件。

所以前面使用this.屬性也就很容易理解了,就是當前物件的屬性。
小結
介紹了Java中this主要使用的三個方面:①類中的屬性呼叫要加上this:this。屬性的方式。②this用來建構函式之間的相互呼叫,一定要保留調用出口③this表示當前物件,指的是當前正在呼叫類方法的物件。