歡迎您光臨本站 註冊首頁

This關鍵字在Java語言中的應用

←手機掃碼閱讀     火星人 @ 2014-03-10 , reply:0

  應用一:引用成員變數.

  

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.這就轉換為正規的成員變數應用了.

  應用二:調用類的構造方法.

  在一個Java類中,其方法可以分為成員方法和構造方法兩種.構造方法是一個與類同名的方法,在Java類中必須存在一個構造方法.如果在代碼中沒有顯示的體現構造方法的話,那麼編譯器在編譯的時候會自動添加一個沒有形式參數的構造方法.這個構造方法跟普通的成員方法還是有很多不同的地方.如構造方法的話一律是沒有返回值的.也不用void關鍵字來說明這個構造方法沒有返回值.而普通的方法可以有返回值、也可以沒有返回值,程序員可以根據自己的需要來定義.不過如果普通的方法沒有返回值的話,那麼一定要在方法定義的時候採用void關鍵字來進行說明.其次構造方法的名字有嚴格的要求,即必須與類的名字相同.也就是說,Java編譯器發現有個方法與類的名字相同才把其當作構造方法來對待.而對於普通方法的話,則要求不能夠與類的名字相同,多個成員方法不能夠採用相同的名字.在一個類中可以存在多個構造方法,這些構造方法都採用相同的名字.只是形式參數不同.Java語言就憑用戶參數的參數來判斷調用那個構造方法.

  this關鍵字除了可以調用成員變數之外,還可以調用構造方法.如下面的代碼:

  

public class Student{ //定義一個類,類的名字為student.

  public Student(){ //定義一個方法,名字與類相同故為構造方法

  this(「luobo」)

  }

  public Student(String name){ //定義一個帶形式參數的構造方法

  }

  }

  在上面這個代碼中,筆者定義了兩個構造方法,一個帶參數,另一個沒有帶參數.構造方法都不會有返回值,不過由於構造方法的特殊性,為此不必要在構造方法定義時帶上void關鍵字來說明這個問題.在第一個沒有帶參數的構造方法中,筆者使用了this(「luobo」)這個代碼.這個代碼表示什麼含義呢?在構造方法中使this關鍵字表示調用類中的構造方法.如果一個類中有多個構造方法,其名字都相同,跟類名一致,那麼這個this到底是調用哪個構造方法呢?其實,這跟採用其他方法引用構造方法一樣,都是通過形式參數來嗲用構造方法的.如上例中,this關鍵字後面加上了一個參數,那麼就表示其引用的是帶參數的構造方法.如果現在有三個構造方法,分別為不帶參數、帶一個參數、帶兩個參數.那麼Java編譯器會根據所傳遞的參數數量的不同,來判斷該調用哪個構造方法.從上面這個示例中可以看出,this關鍵字不僅可以用來引用成員變數,還可以用來引用構造方法.

  不過如果要使用這種方式來調用構造方法的話,有一個語法上的限制.一般來說,利用this關鍵字來調用構造方法,只有在無參數構造方法中第一句使用this調用有參數的構造方法.否則的話,翻譯的時候,就會有錯誤信息.這跟引用成員變數不同.如果引用成員變數的話,this關鍵字是沒有位置上的限制的.如果不熟悉這個限制的話,那麼還是老老實實的採用傳統的構造方法調用方式為好.雖然比較麻煩,但是至少不會出錯.

  應用三:返回對象的值.

  this關鍵字除了可以引用變數或者成員方法之外,還有一個重大的作用就是返回類的飲用.如在代碼中,可以使用return this,來返回某個類的引用.此時這個this關鍵字就代表類的名稱.如這個代碼在上面這個student類中,那麼這個代碼其代表的含義就是return student.可見,這個this關鍵字除了可以引用變數或者成員方法之外,還可以做為類的返回值.這才是this關鍵字最引人注意的地方.

  在使用this關鍵字的時候,需要注意一個細節問題.在筆者談到的第一個案例中,利用this關鍵字來引用成員變數.即this.name=name.這個語句是將局部變數或則形式參數賦值給成員變數.其實,此時這個this關鍵字不加也可以起到類似的效果.即上面這個語句中,與name=name這個語句時相同的.即Java編譯器會自動將第一個name當作成員變數來對待.而將等號右邊的name變數當作形式參數.雖然這麼書寫代碼,可以節省this這幾個字元的輸入.但是對於代碼的閱讀是不利的.為此,從代碼的閱讀性考慮,如果成員變數與形式參數或者局部變數相同的話,那麼最好是使用this.成員變數(成員方法)的方式來引用成員變數.雖然語法上沒有錯誤,但是作為一個高級的JAVA程序員,在代碼書寫的規範上,也不能夠忽視.


[火星人 ] This關鍵字在Java語言中的應用已經有413次圍觀

http://coctec.com/docs/java/show-post-61357.html