一、java中this關鍵字的三個用法
(1) this調用本類中的屬性,也就是類中的成員變量;
(2) this調用本類中的其他方法;
(3) this調用本類中的其他構造方法,調用時要放在構造方法的首行。
1、this.屬性名
當局部變量與全局變量同名時,總是指向局部的變量(就近原則)。若要指向全局變量,就用 this.屬性名 指向成員變量。
若不同名無沖突,則可以省略this。
public class Teacher {
private String name;
private double salary;
private int age;
// 建立構造方法,為上面的3個屬性賦初始值
public Teacher(String name,double salary,int age) { //形參與成員量沖突
this.name = name;
this.salary = salary;
this.age = age;
}
}
2、this.方法名
讓類中一個方法,通路該類裡的另一個方法或執行個體變量。
/**
* 第一種定義Dog類方法
**/
public class Dog {
// 定義一個jump()方法
public void jump() {
System.out.println("正在執行jump方法");
}
// 定義一個run()方法,run()方法需要借助jump()方法
public void run() {
Dog d = new Dog();
d.jump();
System.out.println("正在執行 run 方法");
}
}
在上面的程式中,一共産生了兩個 Dog 對象,在 Dog 類的 run( ) 方法中,程式建立了一個 Dog 對象,并使用名為 d 的引用變量來指向該 Dog 對象。
下面我們思考兩個問題。
1)在 run( ) 方法中調用 jump( ) 方法時是否一定需要一個 Dog 對象?
答案是肯定的,因為沒有使用 static 修飾的成員變量和方法都必須使用對象來調用。
2)是否一定需要重新建立一個 Dog 對象?
不一定,因為當程式調用 run( ) 方法時,一定會提供一個 Dog 對象,這樣就可以直接使用這個已經存在的 Dog 對象,而無須重新建立新的 Dog 對象了。是以需要在 run() 方法中獲得調用該方法的對象,通過 this 關鍵字就可以滿足這個要求。
this 可以代表任何對象,當 this 出現在某個方法體中時,它所代表的對象是不确定的,但它的類型是确定的,它所代表的隻能是目前類的執行個體。隻有當這個方法被調用時,它所代表的對象才被确定下來,誰在調用這個方法,this 就代表誰。
将前面的 Dog 類的 run( ) 方法改為如下形式會更加合适,run( ) 方法代碼修改如下,其它代碼不變。
**
* 第二種定義Dog類方法
**/
// 定義一個run()方法,run()方法需要借助jump()方法
public void run() {
// 使用this引用調用run()方法的對象
this.jump();
System.out.println("正在執行run方法");
}
從第一種 Dog 類定義來看,在 Dog 對象的 run( ) 方法内重新建立了一個新的 Dog 對象,并調用它的 jump( ) 方法,這意味着一個 Dog 對象的 run( ) 方法需要依賴于另一個 Dog 對象的 jump( ) 方法,這不符合邏輯。
第二種 Dog 類定義是當一個 Dog 對象調用 run( ) 方法時,run( ) 方法需要依賴它自己的 jump( ) 方法,與第一種定義類的方法相比,更符合實際情形。
在現實世界裡,對象的一個方法依賴于另一個方法的情形很常見,例如,吃飯方法依賴于拿筷子方法,寫程式方法依賴于敲鍵盤方法。這種依賴都是同一個對象兩個方法之間的依賴。是以,Java 允許對象的一個成員直接調用另一個成員,可以省略 this 字首。也就是說,将上面的 run( ) 方法改為如下形式也完全正确。
通常,一個方法通路該類中定義的其他方法、成員變量時,可省略 this 。
注意:
static 修飾的方法中不能使用 this
,
靜态成員不能直接通路非靜态成員。
static 修飾的方法而言,可以使用類來直接調用該方法.
3、this( ) 用于通路構造方法
調用本類中的其他構造方法,調用時要放在構造方法的首行。
public class Student {
String name;
// 1 無參構造方法
public Student() {
this("張三"); //調用了構造方法2
}
// 2 有參構造方法
public Student(String name) {
this.name = name;
}
// 輸出name和age
public void print() {
System.out.println("姓名:" + name);
}
public static void main(String[] args) {
Student stu = new Student();
stu.print();
}
}
注意:
- this( ) 不能在普通方法中使用,隻能寫在構造方法中。
- 在構造方法中使用時,必須是第一條語句。
原文連結:http://c.biancheng.net/view/953.html