javase學習筆記]-7.7 this之細節與應用
這一節我們接著上一節來繼續學習this關鍵字.
我們之前在7.5節中的建構函式應注意的細節中提到過一個細節就是建構函式可以調用一般函數,但一般函數不能直接調用建構函式.但是我們沒有深究建構函式能不能調用建構函式,那麼現在我們就來看一看這個問題.
那麼建構函式與建構函式之間是怎麼訪問呢?
為了掌握這個問題,我們必須要明確一個概念,那就是在一個類中的成員如果要被執行,就必須由對象調用.而每個對象都有一個所屬的this.
java語言給了關鍵字this這個功能,那就是用this調用建構函式,而且也是通過參數不同選擇調用不同的建構函式.
我們來看一個例子:
class Person{private String name;private int age;Person()//構造方法1{System.out.println("person run");}Person(String name)//構造方法2{this.name = name;}Person(String name,int age)//構造方法3{this.name = name;this.age = age;}public void speak(){System.out.println(this.name+":"+this.age);}}
class ThisTest {public static void main(String[] args) {Person kobe = new Person("科比",37);kobe.speak();}}對於上面的例子我們可以看到,建構函式3中的第一句語句其實我們已經通過建構函式2實現了,那麼為了提高代碼的複用性,我們為什麼不調用建構函式2呢,java語言中用下面的語句來調用建構函式:
Person(String name,int age)//構造方法3{this(name);//用this關鍵字調用了建構函式Person(String name)this.age = age;}我們看到了this關鍵字可以用於在建構函式中調用其他建構函式,當然對於調用那個建構函式,還是通過參數來確定.
那麼我們就明確了建構函式與建構函式之間的調用形式.
下面我們來看兩個this關鍵字用法中需要注意的兩個細節:
第一個細節:建構函式中調用建構函式只能定義在建構函式的第一行.
這是為什麼呢,因為初始化動作一定要先執行.這就是java語言定義的一個規則,如果不是定義在第一行,編譯直接通不過.
我們看例子,把上面的建構函式3的語句交換位置:
Person(String name,int age)//構造方法3{this.age = age;this(name);//用this關鍵字調用了建構函式Person(String name)}我們看編譯情況:
我們看到編譯錯誤:對this的調用必須是構造器中的第一個語句,這就是我們在使用this關鍵字時的第一個細節.
第二個細節:注意建構函式的調用出現遞迴迴圈而導致棧內在溢出.
我們看個例子:
<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHByZSBjbGFzcz0="brush:java;">Person()//構造方法1{this("KOBE");System.out.println("person run");}Person(String name)//構造方法2{this();this.name = name;}
結果:
我們很容易發現兩個建構函式相互調用,形成了遞迴,使得兩個建構函式不斷進棧,最後棧記憶體溢出,程式終止.
上面我們看了兩個在使用this關鍵字時需要注意的細節,下面我們再簡單的看看this關鍵的應用情況.
我們一般什麼時候使用this呢,我們上一節中說過this的概念:this就代表對象,就是所在函數所在對象的引用.那麼我們不難理解,當我們在一個類中用到了本類的對象,我們就通常會用this來引用.
那麼我們來實現一個功能:判斷兩個人是否是同齡人.
分析一下:要判斷兩個人是否同齡,我們只需要比較這兩個人(也就是兩個Person對象)的年齡是否相等即可,那麼也就是說一個對象可以直接調用Person類中的方法來與另一個對象做比較就可以了.
我們可以這樣實現:
//判斷兩個人是否同齡public boolean compare(Person p){return this.age == p.age;}我們來測試一下:
class ThisTest {public static void main(String[] args) {Person kobe = new Person("科比",37);Person james = new Person("詹姆斯",31);kobe.speak();james.speak();System.out.println("這兩個人相等嗎:"+kobe.compare(james));}}結果:
我們看到this的主要應用就是代表對象,那個對象調用了this所有的函數,我們就通俗的認為this就代表那個對象.