程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java編程那些事兒67——this和super

Java編程那些事兒67——this和super

編輯:關於JAVA

下面再來介紹一下this和super關鍵字的使用。在程序中通過使用this和super關鍵字,可以實現對於類內部很多內容方便的引用,也有助於理解面向對象的實現原理,更方便的理解面向對象技術的內部實現。

8.8.1 this關鍵字

this關鍵字代表自身,在程序中主要的使用用途有以下幾個方面:

l 使用this關鍵字引用成員變量

l 使用this關鍵字在自身構造方法內部引用其它構造方法

l 使用this關鍵字代表自身類的對象

l 使用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關鍵字可以在子類中引用父類中的內容。主要的使用形式有以下幾種:

l 在子類的構造方法內部引用父類的構造方法

l 在子類中調用父類中的成員方法

l 在子類中調用父類中的成員變量

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. 下一頁:
Copyright © 程式師世界 All Rights Reserved