這一節我們接著上一節來繼續學習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關鍵字時的第一個細節.
**第二個細節:注意構造函數的調用出現遞歸循環而導致棧內在溢出.**
我們看個例子:
~~~
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就代表那個對象.
- 前言
- 1.1 基本常識
- 1.2 Java語言概述
- 1.3 Java語言的環境搭建
- 1.4 Java程序開發之初體驗--Hello World
- 2.1 關鍵字
- 2.2 標識符
- 2.3 注釋
- 2.4 常量
- 2.5 進制掃盲
- 2.6 變量和數據類型(1)
- 2.7 變量和數據類型(2)
- 2.8 運算符
- 3.1 if語句
- 3.2 switch語句
- 3.3 while和do-while語句
- 3.4 for語句
- 3.5 for循環的嵌套
- 3.6 break語句與continue語句
- 4.1 函數的定義
- 4.2 定義函數的兩個明確
- 4.3 函數的內存加載過程
- 4.4 函數的重載
- 5.1 數組的定義
- 5.2 數組的內存分配及特點
- 5.3 數組操作中常見問題
- 5.4 數組常用操作(1)
- 5.5 數組常用操作(2)
- 5.6 二維數組
- 6.1 面向對象的概述
- 6.2 類與對象的關系
- 6.3 對象的內存體現
- 6.4 成員變量與局部變量
- 6.5 類類型參數與匿名對象
- 6.6 基本數據類型參數與引用數據類型參數的傳遞過程
- 6.7 封裝
- 7.1 構造函數概述與默認構造函數
- 7.2 構造函數與一般函數的區別
- 7.3 構造函數的重載
- 7.4 構造函數的內存加載
- 7.5 構造函數需要注意的幾個細節
- 7.6 this關鍵字的原理
- 7.7 this關鍵字的細節與應用
- 8.1 static關鍵字之特點
- 8.2 成員變量與靜態變量的區別
- 8.3 static關鍵字使用的注意細節
- 8.4 main函數的解析與細節
- 8.5 static關鍵字的使用場景
- 8.6 靜態的內存加載
- 8.7 靜態代碼塊
- 8.8 構造代碼塊
- 9.1 繼承
- 9.2 單繼承與多重繼承
- 9.3 子父類中成員變量特征體現