## Java編程那些事兒67——this和super
陳躍峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
### 8.8 this和super
下面再來介紹一下this和super關鍵字的使用。在程序中通過使用this和super關鍵字,可以實現對于類內部很多內容方便的引用,也有助于理解面向對象的實現原理,更方便的理解面向對象技術的內部實現。
#### 8.8.1 this關鍵字
this關鍵字代表自身,在程序中主要的使用用途有以下幾個方面:
1.? 使用this關鍵字引用成員變量
2.? 使用this關鍵字在自身構造方法內部引用其它構造方法
3.? 使用this關鍵字代表自身類的對象
4.? 使用this關鍵字引用成員方法
##### 8.8.1.1 引用成員變量
在一個類的方法或構造方法內部,可以使用“this.成員變量名”這樣的格式來引用成員變量名,有些時候可以省略,有些時候不能省略。首先看一下下面的代碼:
~~~
?????????????????? /**
?* 使用this引用成員變量
?*/
public class ReferenceVariable {
?????????????????? ???????? private int a;
?????????????????? ????????
?????????????????? ???????? public ReferenceVariable(int a){
?????????????????? ?????????????????? this.a = a;
?????????????????? ???????? }
?????????????????? ????????
?????????????????? ???????? public int getA(){
?????????????????? ?????????????????? return a;
?????????????????? ???????? }
?????????????????? ????????
?????????????????? ???????? public void setA(int a){
?????????????????? ?????????????????? this.a = a;
?????????????????? ???????? }
}
~~~
在該代碼的構造方法和setA方法內部,都是用this.a引用類的成員變量。因為無論在構造方法還是setA方法內部,都包含2個變量名為a的變量,一個是參數a,另外一個是成員變量a。按照Java語言的變量作用范圍規定,參數a的作用范圍為構造方法或方法內部,成員變量a的作用范圍是類的內部,這樣在構造方法和setA方法內部就存在了變量a的沖突,Java語言規定當變量作用范圍重疊時,作用域小的變量覆蓋作用域大的變量。所以在構造方法和setA方法內部,參數a起作用。
這樣需要訪問成員變量a則必須使用this進行引用。當然,如果變量名不發生重疊,則this可以省略。
但是為了增強代碼的可讀性,一般將參數的名稱和成員變量的名稱保持一致,所以this的使用頻率在規范的代碼內部應該很多。
##### 8.8.1.2 引用構造方法
在一個類的構造方法內部,也可以使用this關鍵字引用其它的構造方法,這樣可以降低代碼的重復,也可以使所有的構造方法保持統一,這樣方便以后的代碼修改和維護,也方便代碼的閱讀。
下面是一個簡單的示例:
~~~
???????? ???????? /**
?* 使用this關鍵字引用構造方法
?*/
public class ReferenceConstructor {
???????? int a;
????????
???????? public ReferenceConstructor(){
?????????????????? this(0);
???????? }
????????
???????? public ReferenceConstructor(int a){
?????????????????? this.a = a;
???????? }
}
~~~
這里在不帶參數的構造方法內部,使用this調用了另外一個構造方法,其中0是根據需要傳遞的參數的值,當一個類內部的構造方法比較多時,可以只書寫一個構造方法的內部功能代碼,然后其它的構造方法都通過調用該構造方法實現,這樣既保證了所有的構造是統一的,也降低了代碼的重復。
在實際使用時,需要注意的是,在構造方法內部使用this關鍵字調用其它的構造方法時,調用的代碼只能出現在構造方法內部的第一行可執行代碼。這樣,在構造方法內部使用this關鍵字調用構造方法最多會出現一次。
##### 8.8.1.3 代表自身對象
在一個類的內部,也可以使用this代表自身類的對象,或者換句話說,每個類內部都有一個隱含的成員變量,該成員變量的類型是該類的類型,該成員變量的名稱是this,實際使用this代表自身類的對象的示例代碼如下:
~~~
?????????????????? /**
?* 使用this代表自身類的對象
?*/
public class ReferenceObject {
???????? ReferenceObject instance;
????????
???????? public ReferenceObject(){
?????????????????? instance = this;
???????? }
????????
???????? public void test(){
?????????????????? System.out.println(this);
???????? }
}
~~~
在構造方法內部,將對象this的值賦值給instance,在test方法內部,輸出對象this的內容,這里的this都代表自身類型的對象。
##### 8.8.1.4 引用成員方法
在一個類的內部,成員方法之間的互相調用時也可以使用“this.方法名(參數)”來進行引用,只是所有這樣的引用中this都可以省略,所以這里就不詳細介紹了。
#### 8.8.2 super關鍵字
super關鍵字的中文意思是超級的,使用super關鍵字可以在子類中引用父類中的內容。主要的使用形式有以下幾種:
1.? 在子類的構造方法內部引用父類的構造方法
2.? 在子類中調用父類中的成員方法
3.? 在子類中調用父類中的成員變量
##### 8.8.2.1 引用父類構造方法
在構造子類對象時,必須調用父類的構造方法。而為了方便代碼的編寫,在子類的構造方法內部會自動調用父類中默認的構造方法。但是如果父類中沒有默認的構造方法時,則必須手動進行調用。
使用super可以在子類的構造方法內部調用父類的構造方法。可以在子類的構造方法內部根據需要調用父類中的構造方法。
使用super關鍵字調用父類構造方法的示例代碼如下:
~~~
???????? //文件名:SuperClass.java
public class SuperClass {
????????
???????? public SuperClass(){}
????????
???????? public SuperClass(int a){}
}
???????? //文件名:SubClass.java
public class SubClass extends SuperClass {
???????? public SubClass(){
?????????????????? super();? //可省略
???????? }
????????
???????? public SubClass(int a){
?????????????????? super(a);
???????? }
????????
???????? public SubClass(String s){
?????????????????? super();? //可省略
???????? }
}
~~~
在該示例代碼中,SubClass繼承SuperClass類,在SubClass類的構造方法內部可以使用super關鍵字調用父類SubClass的構造方法,具體調用哪個構造方法沒有限制,可以在子類內部根據需要進行調用,只是根據調用的構造方法不同傳入適當的參數即可。
由于SubClass類的父類SuperClass內部有默認的構造方法,所以SubClass的構造方法內部super()的代碼可以省略。
和使用this關鍵字調用構造方法一樣,super調用構造方法的代碼只能出現在子類構造方法中的第一行可執行代碼。這樣super調用構造方法的代碼在子類的構造方法內部則最多出現一句,且不能和this調用構造方法的代碼一起使用。
##### 8.8.2.2 引用父類成員方法
在子類中繼承了父類中的成員方法,一般可以直接通過方法名使用,但是如果在子類中覆蓋了父類的成員方法以后,如果需要在子類內部調用父類中被覆蓋的成員方法時則不能直接調用了,這樣就又需要使用super關鍵字了。
示例代碼如下:
~~~
?????????????????? //文件名:SuperClass2.java
public class SuperClass2 {
???????? public void test(){}
????????
???????? public void print(int a){
?????????????????? System.out.println("SuperClass2: " + a);
???????? }
}
//文件名:SubClass2
public class SubClass2 extends SuperClass2 {
???????? public void print(int a){
?????????????????? super.print(a);
?????????????????? System.out.println("SubClass2");
???????? }
????????
???????? public void t(){
?????????????????? super.test();? //super可省略
?????????????????? super.print(0); //不可省略
???????? }
}
~~~
##### 8.8.2.3 引用父類成員變量
在子類中如果引用父類的成員變量,也可以使用“super.成員變量”來引用,只是一般成員變量的覆蓋是沒有意義的,所以這個時候都可以直接使用成員變量名進行引用,所以這里的super都可以省略。
#### 8.8.3 注意的問題
最后,在實際使用this和super時,除了上面介紹到的需要注意的問題以外,還需要特別注意的是,this和super都是非靜態的,所以這兩個關鍵字都無法在靜態方法內部進行使用。
- 前言
- (1)序言
- (2)程序設計是什么?
- (3)你適合學習程序設計嗎?
- (4)如何學好程序設計?
- (5)程序設計介紹小結
- (6)計算機軟件基本概念
- (7)進制的概念
- (8)計算機內部的數據表達
- (9)網絡編程基礎
- (10)Java語言簡介
- (11)JDK的獲得、安裝和配置
- (12)第一個HelloWorld程序
- (13)Eclipse基本使用
- (14)Eclipse基礎使用進階
- (15)如何學好Java語法
- (16)代碼框架、關鍵字和標識符
- (17)基本數據類型
- (18)變量和常量
- (19)數據類型轉換
- (20)空白、語句結束和注釋
- (21)算術運算符
- (22)比較運算符
- (23)邏輯運算符
- (24)賦值運算符
- (25)位運算符
- (26)移位運算符
- (27)其它運算符
- (28)運算符優先級
- (29)表達式
- (30)流程控制基礎
- (31)if語句語法(1)
- (32)if語句語法(2)
- (33)if語句語法(3)
- (34)switch語句語法
- (35)while語句語法
- (36)do-while語句語法
- (37)for語句語法
- (38)break和continue語句
- (39)流程控制綜合示例1
- (40)流程控制綜合示例2
- (41)流程控制綜合示例3
- (42)流程控制綜合練習
- (43)數組概述
- (44)數組基礎語法
- (45)數組使用示例1
- (46)數組使用示例2
- (47)數組使用示例3
- (48)多維數組基礎
- (49)多維數組使用示例1
- (50)多維數組使用示例2
- (51)多維數組練習
- (52)方法聲明
- (53)方法聲明示例
- (54)方法調用
- (55)方法重載和參數傳遞
- (56)方法練習
- (57)面向對象基礎
- (58)類(一)
- (59)類(二)
- (60)對象
- (61)面向對象設計方法和面向對象特性(一)
- (62)繼承(二)
- (63)多態性
- (64)訪問控制符、修飾符和其它關鍵字
- (65)static修飾符
- (66)final修飾符
- (67)this和super
- (68)抽象類和接口(一)
- (69)抽象類和接口(二)
- (70)抽象類和接口(三)
- (71)內部類簡介
- (72)包的概念
- (73)JDK文檔使用
- (74)java.lang包介紹1
- (75)String類使用
- (76)StringBuffer類和System類
- (77)包裝類
- (78)時間和日期處理
- (79)Random隨機處理
- (80)集合框架簡述
- (81)異常處理概述
- (82)異常處理語法1
- (83)異常處理語法2
- (84)IO簡介
- (85)IO類體系
- (86)文件操作之File類使用
- (87)文件操作之讀取文件
- (88)文件操作之寫文件
- (89)讀取控制臺輸入
- (90)裝飾流使用1
- (91)裝飾流使用2
- (92)IO使用注意問題
- (93)多線程基礎
- (94)多線程實現方式1
- (95)多線程實現方式2
- (96)多線程使用示例1
- (97)多線程使用示例2
- (98)多線程問題及處理1
- (99)多線程問題及處理2
- (100)多線程問題及處理3
- (101)網絡編程概述
- (102)網絡編程技術1
- (103)網絡編程技術2
- (104)網絡編程技術3
- (105)網絡編程技術4
- (106)網絡編程技術5
- (107)網絡協議概念
- (108)網絡編程示例1
- (109)網絡編程示例2
- (110)網絡編程小結