天天看點

this關鍵字的三種用法和舉例

一、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