java中this關鍵字


java中this關鍵字的作用

一、this關鍵字主要有三個應用:
 (1)this調用本類中的屬性,也就是類中的成員變量;
 (2)this調用本類中的其他方法;
 (3)this調用本類中的其他構造方法,調用時要放在構造方法的首行。
Public Class Student { 
 String name; //定義一個成員變量name
 private void SetName(String name) { //定義一個參數(局部變量)name
  this.name=name; //將局部變量的值傳遞給成員變量
 }
}
應用一:引用成員變量
 如上面這段代碼中,有一個成員變量name,同時在方法中有一個形式參數,名字也是name,然后在方法中將形式參數name的值傳遞給成員變量name,雖然我們可以看明白這個代碼的含義,但是作為Java編譯器它是怎么判斷的呢?到底是將形式參數name的值傳遞給成員變量name,還是反過來將成員變量name的值傳遞給形式參數name呢?也就是說,兩個變量名字如果相同的話,那么Java如何判斷使用哪個變量?此時this這個關鍵字就起到作用了。this這個關鍵字其代表的就是對象中的成員變量或者方法。也就是說,如果在某個變量前面加上一個this關鍵字,其指的就是這個對象的成員變量或者方法,而不是指成員方法的形式參數或者局部變量。為此在上面這個代碼中,this.name代表的就是對象中的成員變量,又叫做對象的屬性,而后面的name則是方法的形式參數,代碼this.name=name就是將形式參數的值傳遞給成員變量。這就是上面這個代碼的具體含義。
 一般情況下,在Java語言中引用成員變量或者成員方法都是以對象名.成員變量或者對象名.成員方法的形式。不過有些程序員即使在沒有相同變量的時候,也喜歡使用this.成員變量的形式來引用變量,這主要是從便於代碼的閱讀考慮的。一看到這個this關鍵字就知道現在引用的變量是成員變量或者成員方法,而不是局部變量。這無形中就提高了代碼的閱讀性。不過話說回來,這是this關鍵字在Java語言中的最簡單的應用。從這個應用中,我們可以看出this關鍵字其代表的就是對象的名字。
 其實如果是局部變量的話,也是相同的道理。如在上面的代碼中,name不是形式參數,而是一個局部變量。此時Java也會遇到相同的疑惑,即變量名name代表的到底是局部變量還是形式參數?name=name到底代表的是什么含義?根據局部變量的作用域,在方法內部,如果局部變量與成員變量同名的話,那么是以局部變量為准。可是在name=name這個賦值語句中,將局部變量的值賦值給自己,顯然並不是很合適。根據代碼的含義,本來的意思應該是將局部變量賦值給成員變量。為了更清晰的表達這個含義,為此最好采用如下的書寫格式this.name=name。這里的this關鍵字含義就是對象名student,為此this.name就表示student.name。
應用二:調用類的構造方法
public class Student { //定義一個類,類的名字為student。 
 public Student() { //定義一個方法,名字與類相同故為構造方法
  this(“Hello!”);
 }
 public Student(String name) { //定義一個帶形式參數的構造方法
 }
}
  this關鍵字除了可以調用成員變量之外,還可以調用構造方法。在一個Java類中,其方法可以分為成員方法和構造方法兩種。構造方法是一個與類同名的方法,在Java類中必須存在一個構造方法。如果在代碼中沒有顯示的體現構造方法的話,那么編譯器在編譯的時候會自動添加一個沒有形式參數的構造方法。這個構造方法跟普通的成員方法還是有很多不同的地方。如構造方法一律是沒有返回值的,而且也不用void關鍵字來說明這個構造方法沒有返回值。而普通的方法可以有返回值、也可以沒有返回值,程序員可以根據自己的需要來定義。不過如果普通的方法沒有返回值的話,那么一定要在方法定義的時候采用void關鍵字來進行說明。其次構造方法的名字有嚴格的要求,即必須與類的名字相同。也就是說,Java編譯器發現有個方法與類的名字相同才把其當作構造方法來對待。而對於普通方法的話,則要求不能夠與類的名字相同,而且多個成員方法不能夠采用相同的名字。在一個類中可以存在多個構造方法,這些構造方法都采用相同的名字,只是形式參數不同。Java語言就憑形式參數不同來判斷調用那個構造方法。
 在上面這段代碼中,定義了兩個構造方法,一個帶參數,另一個沒有帶參數。構造方法都不會有返回值,不過由於構造方法的特殊性,為此不必要在構造方法定義時帶上void關鍵字來說明這個問題。在第一個沒有帶參數的構造方法中,使用了this(“Hello!”)這句代碼,這句代碼表示什么含義呢?在構造方法中使this關鍵字表示調用類中的構造方法。如果一個類中有多個構造方法,因為其名字都相同,跟類名一致,那么這個this到底是調用哪個構造方法呢?其實,這跟采用其他方法引用構造方法一樣,都是通過形式參數來調用構造方法的。如上例中,this關鍵字后面加上了一個參數,那么就表示其引用的是帶參數的構造方法。如果現在有三個構造方法,分別為不帶參數、帶一個參數、帶兩個參數。那么Java編譯器會根據所傳遞的參數數量的不同,來判斷該調用哪個構造方法。從上面示例中可以看出,this關鍵字不僅可以用來引用成員變量,而且還可以用來引用構造方法。
 不過如果要使用這種方式來調用構造方法的話,有一個語法上的限制。一般來說,利用this關鍵字來調用構造方法,只有在無參數構造方法中第一句使用this調用有參數的構造方法。否則的話,翻譯的時候,就會有錯誤信息。這跟引用成員變量不同。如果引用成員變量的話,this關鍵字是沒有位置上的限制的。如果不熟悉這個限制的話,那么還是老老實實的采用傳統的構造方法調用方式為好。雖然比較麻煩,但是至少不會出錯。
應用三:返回對象的值
 this關鍵字除了可以引用變量或者成員方法之外,還有一個重大的作用就是返回類的引用。如在代碼中,可以使用return this,來返回某個類的引用。此時這個this關鍵字就代表類的名稱。如代碼在上面student類中,那么代碼代表的含義就是return student。可見,這個this關鍵字除了可以引用變量或者成員方法之外,還可以作為類的返回值,這才是this關鍵字最引人注意的地方。

java 中的this關鍵字的幾種用法

 

 

1.     當成員變量和局部變量重名時,在方法中使用this時,表示的是該方法所在類中的成員變量。(this是當前對象自己)

復制代碼
public class Hello {
    String s = "Hello";
 
    public Hello(String s) {
       System.out.println("s = " + s);
       System.out.println("1 -> this.s = " + this.s);
       this.s = s;//把參數值賦給成員變量,成員變量的值改變
       System.out.println("2 -> this.s = " + this.s);
    }
 
    public static void main(String[] args) {
       Hello x = new Hello("HelloWorld!");
       System.out.println("s=" + x.s);//驗證成員變量值的改變
    }
}
復制代碼
1
2
3
4
結果為:s = HelloWorld!
1 ->  this .s = Hello
2 ->  this .s = HelloWorld!
s=HelloWorld!

  在這個例子中,構造函數Hello中,參數s與類Hello的成員變量s同名,這時如果直接對s進行操作則是對參數s進行操作。若要對類Hello的成員變量s進行操作就應該用this進行引用。運行結果的第一行就是直接對構造函數中傳遞過來的參數s進行打印結果; 第二行是對成員變量s的打印;第三行是先對成員變量s賦傳過來的參數s值后再打印,所以結果是HelloWorld!而第四行是主函數中直接打印類中的成員變量的值,也可以驗證成員變量值的改變。

2.把自己當作參數傳遞時,也可以用this.(this作當前參數進行傳遞)

復制代碼
  class A {
    public A() {
       new B(this).print();// 調用B的方法
    }
    public void print() {
       System.out.println("HelloAA from A!");
    }
}
class B {
    A a;
    public B(A a) {
       this.a = a;
    }
    public void print() {
       a.print();//調用A的方法
       System.out.println("HelloAB from B!");
    }
}
public class HelloA {
    public static void main(String[] args) {
       A aaa = new A();
       aaa.print();
       B bbb = new B(aaa);
       bbb.print();
    }
}
1
2
3
4
5
6
結果為:
HelloAA  from  A!
HelloAB  from  B!
HelloAA  from  A!
HelloAA  from  A!
HelloAB  from  B!

  

在這個例子中,對象A的構造函數中,用new B(this)把對象A自己作為參數傳遞給了對象B的構造函數。

3.有時候,我們會用到一些內部類和匿名類,如事件處理。當在匿名類中用this時,這個this則指的是匿名類或內部類本身。這時如果我們要使用外部類的方法和變量的話,則應該加上外部類的類名。如:

復制代碼
 public class HelloB {
    int i = 1;
 
    public HelloB() {
       Thread thread = new Thread() {
           public void run() {
              for (int j=0;j<20;j++) {
                  HelloB.this.run();//調用外部類的方法
                  try {
                     sleep(1000);
                  } catch (InterruptedException ie) {
                  }
              }
           }
       }; // 注意這里有分號
       thread.start();
    }
 
    public void run() {
       System.out.println("i = " + i);
       i++;
    }
   
    public static void main(String[] args) throws Exception {
       new HelloB();
    }
}
復制代碼

在上面這個例子中, thread 是一個匿名類對象,在它的定義中,它的 run 函數里用到了外部類的 run 函數。這時由於函數同名,直接調用就不行了。這時有兩種辦法,一種就是把外部的 run 函數換一個名字,但這種辦法對於一個開發到中途的應用來說是不可取的。那么就可以用這個例子中的辦法用外部類的類名加上 this 引用來說明要調用的是外部類的方法 run。

4.    在構造函數中,通過this可以調用同一類中別的構造函數。如:

復制代碼
public class ThisTest {
    ThisTest(String str) {
       System.out.println(str);
    }
    ThisTest() {
       this("this測試成功!");
    }
 
    public static void main(String[] args) {
       ThisTest thistest = new ThisTest();
    }
}
復制代碼

為了更確切的說明this用法,另外一個例子為:

復制代碼
public class ThisTest {
    private int age;
    private String str;
 
    ThisTest(String str) {
       this.str=str;
       System.out.println(str);
    }
    ThisTest(String str,int age) {
       this(str);
       this.age=age;
       System.out.println(age);
    }
 
    public static void main(String[] args) {
       ThisTest thistest = new ThisTest("this測試成功",25);
      
    }
}
復制代碼
1
2
3
結果為:
this 測試成功
25

值得注意的是: 
  1:在構造調用另一個構造函數,調用動作必須置於最起始的位置。 
  2:不能在構造函數以外的任何函數內調用構造函數。 
  3:在一個構造函數內只能調用一個構造函數。

5.this同時傳遞多個參數。

復制代碼
public class TestClass {
    int x;
    int y;
 
    static void showtest(TestClass tc) {//實例化對象
       System.out.println(tc.x + " " + tc.y);
    }
    void seeit() {
       showtest(this);
    }
 
    public static void main(String[] args) {
       TestClass p = new TestClass();
       p.x = 9;
       p.y = 10;
       p.seeit();
    }
}
復制代碼
1
結果為:9 10

  代碼中的showtest(this),這里的this就是把當前實例化的p傳給了showtest()方法,從而就運行了。





 
         

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM