java中this關鍵字的用法

Diy_os發表於2015-11-15

對於this關鍵字,都不陌生,只要在java程式程式碼中都可見,下面是android中繫結按鈕監聽一段程式碼:

點選(此處)摺疊或開啟

  1. button1.setOnClickListener(new OnClickListener() {
  2.             
  3.             @Override
  4.             public void onClick(View v) {
  5.                 // TODO 自動生成的方法存根
  6.                 Intent intent = new Intent(MainActivity.this,SecondActivity.class);//傳入MainActivity作為上下文
  7.                 startActivity(intent);
  8.                 //MainActivity.this.startActivity(intent);
  9.             }
  10.         });
MainActivity.this的意思一目瞭然,指的是當前MainActivity物件

下面看一段很常見的程式碼:

點選(此處)摺疊或開啟

  1. public class this1{
  2.     
  3.     private int i;
  4.     
  5.     this1(int i){
  6.         this.i = i;
  7.         this.geti();
  8.         this1.printname();
  9.         int c = 0;
  10.     }
  11.     
  12.     static{
  13.         
  14.         int i = 9;
  15.         System.out.println("static塊中的i:" + i);
  16.     }
  17.     public void geti(){
  18.         
  19.         System.out.println(this.i);
  20.         this.printname();
  21.     }
  22.     public static void printname(){
  23.         
  24.         System.out.println("lios");
  25.     }
  26.     public static void main(String[] args){
  27.         
  28.         new this1(1);
  29.         //geti();靜態方法內不可以呼叫非靜態方法,反之可以
  30.     }
  31. }
當在堆中new出記憶體空間時,系統就呼叫構造器,初始化該物件。構造器中的this含義指的就是當前物件。在構造器中,呼叫物件中非靜態方法時,可以省略this關鍵字,但是在呼叫靜態方法時,雖然可以透過this來呼叫並透過編譯,但是java建議我們用類名呼叫靜態方法。但是在static方法或者static塊中,是不能呼叫非static方法,這一點需要注意。
建構函式也是一個特殊的static方法,它沒有返回值,我是這樣理解的,在new出一個物件時系統自動呼叫了建構函式,用來初始化例項;在類中如果有static方法塊時(如上圖),系統載入時,首先初始化static欄位以及方法,然後才呼叫構造器,兩者有相似之處。上述個人看法可以說是無稽之談,當然深入的理解java構造器,還需要理解JVM機制,鑑於本人水平有限,這裡不作分析。

下面看一個很有趣的程式:

點選(此處)摺疊或開啟

  1. public class This1 {
  2.     
  3.      public int i = 0;
  4.      
  5.      public This1 getthis(){
  6.         i++;
  7.         return this;
  8.     }
  9.      public void geti(){
  10.         
  11.         System.out.println(i);
  12.     }
  13.     public static void main(String[] args){
  14.         
  15.         This1 th = new This1();
  16.         th.getthis().getthis().getthis().getthis().geti();
  17.         System.out.println(th);
  18.         System.out.println(th.getthis());
  19.         System.out.println(th.getthis().getthis());
  20.         System.out.println(th.getthis().getthis().getthis());
  21.         System.out.println(th.getthis() == th.getthis().getthis());
            System.out.println(th.getthis().getthis()== th.getthis().getthis().getthis().getthis());

  22.     }
  23. }
有前面的簡單的介紹,上面的程式碼很容易看明白,getthis()返回當前物件的引用(this),返回的引用指向同一塊記憶體區域。

下面的程式碼也許會有點新奇:

點選(此處)摺疊或開啟

  1. public class Thiss {
  2.     private int i;
  3.     Thiss(int i){
  4.         
  5.         int j = i;
  6.         System.out.println("j:"+j);
  7.     }
  8.     public Thiss(String ss) {
  9.         this(1);
  10.         String s = ss;
  11.         System.out.println("s:"+s);
  12.     }
  13.     public Thiss() {
  14.         this("diy_os");
  15.     }
  16.     
  17.  public static void main(String[] args){
  18.     
  19.      new Thiss();
  20.  }
      }
this可以呼叫當前物件的構造器,用來初始化物件域。一個類可以有很多構造器,this透過構造器中不同的引數列表,來呼叫不同的構造器,也就是過載機制。注意:this呼叫構造器時,必須放在構造器的首行,否則報錯。


this可以將當前物件傳給其他方法:

點選(此處)摺疊或開啟

  1. public class Person {
  2.   public void eat(Apple apple){
  3.      Apple appled = apple.getPeeled();
  4.      System.out.println("Yummy");
  5.      System.out.println(appled);
  6.   }
  7. }

  8. public class Peeler {
  9.   static Apple peel(Apple apple){
  10.     
  11.      return apple;
  12.   }
  13. }

  14. public class Apple {
  15.   
  16.     Apple getPeeled(){
  17.         return Peeler.peel(this);
  18.     }
  19. }

  20. public class PassingThis {
  21.     
  22.  public static void main(String[] args){
  23.     
  24.      Apple A = new Apple();
  25.      new Person().eat(A);
  26.      System.out.println(A);
  27.      System.out.println(A.getPeeled());
  28.  }
  29. }
(上面程式碼摘自《thinking in java》)書中的解釋是:Apple需要呼叫Peeler.peel()方法,它是一個外部的工具方法,將執行由於某種原因而必須放在Apple外部的操作(也許是因為該外部方法要應用於許多不同的類,而你卻不想重複這些程式碼)。為了將其自身傳遞給外部方法,Apple必須使用this關鍵字。

文章用於學習總結,如有不當錯誤之處,請讀者指正!謝謝!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1839283/,如需轉載,請註明出處,否則將追究法律責任。

相關文章