1. 程式人生 > >JAVA中this和super用法

JAVA中this和super用法

出現 子句 package code rgs lean 眼睛 都是 java對象

  參考網上資料和自行理解總結java中this和super中各自用法及其差異

  <一>. this的用法

  構造方法是創建java對象的重要途徑,通過new關鍵字調用構造器時,構造器返回該類的對象,但是這個對手並不是完全由構造器負責創建. 創建一個對象分為如下四步:

  a. 分配對象空間,並將對象成員變量初始化為0或者null

  b. 執行屬性值的顯式初始化

  c. 執行構造方法

  d. 返回對象的地址給相關變量

  this的本質就是“創建好的的對象的地址”, 由於在構造方法調用前,對象已經創建. 因此,在構造方法中也可以使用this代表“當前對象”.

  書上對於this的描述

  this表示一個對象的引用,它指向正在執行方法的對象. 特別的, 在構造方法中,通過this關鍵字調用其他構造方法時,必須放在第一行,否則編譯器會報錯. 且在構造方法中, 只能通過this調用一次其他構造方法.

  this舉例一

package cn.sxt.oop;

public class Test_this_super {
    int id;
    String name;
    boolean man;
    double width;
    public Test_this_super(){
        System.out.println("無參數構造器");
    }
    
    
public Test_this_super(int number,String name){ this(); System.out.println("傳遞int和String形式參數構造器"); } public Test_this_super(int number,String name,double _width){ this(number,name); this.width = _width; System.out.println("傳遞int, String, double形式參數構造器"); }
public Test_this_super(int number,String name,char a){ System.out.println("傳遞int, String, char形式參數構造器"); } public static void main(String[] args) { Test_this_super t1 = new Test_this_super(); Test_this_super t2 = new Test_this_super(1000,"Tom"); Test_this_super t3 = new Test_this_super(2000,"long",3.14); Test_this_super t4 = new Test_this_super(2000,"long",‘a‘); } }

  打印結果

 t1   無參數構造器
 t2   無參數構造器
      傳遞int和String形式參數構造器
 t3   無參數構造器
      傳遞int和String形式參數構造器
      傳遞int, String, double形式參數構造器
 t4   傳遞int, String, char形式參數構造它器   

  圖形分析如下;

技術分享圖片

  <二> super用法

  super是指向父類的引用,如果構造方法沒有顯示地調用父類的構造方法,那麽編譯器會自動為它加上一個默認的super()方法調用。如果父類由沒有默認的無參構造方法,編譯器就會報錯,super()語句必須是構造方法的第一個子句。

  定義子類的一個對象時,會先調用子類的構造函數,然後在調用父類的構造函數,如果父類函數足夠多的話,會一直調用到最終的父類構造函數,函數調用時會使用棧空間,所以按照入棧的順序,最先進入的是子類的構造函數,然後才是鄰近的父類構造函數,最後再棧頂的是最終的父類構造函數,構造函數執行是則按照從棧頂到棧底的順序依次執行.

  現在以Bird--> Animal --> Object 為線舉例說明

public class Animal {
    int eye = 2;
    public Animal(){
        super();
        System.out.println("動物");
    }
    
    public void run(){
        System.out.println("動物有不同走路方式");
    }
    
    public static void main(String[] args) {
        Bird b = new Bird();
        b.run();
    }
}

class Bird extends Animal{
    public Bird(){
        super();
        System.out.println("鳥類");
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run(); // 通過super可以用父類方法和屬性
        System.out.println("鳥是飛飛飛飛飛飛");
        System.out.println("鳥類有"+super.eye+"只眼睛");
    }
    
}

  打印結果

動物
鳥類
動物有不同走路方式
鳥是飛飛飛飛飛飛
鳥類有2只眼睛

  Bird--> Animal --> Object 圖形分析如下

技術分享圖片

  <三> this和super差異

  1)super(參數):調用基類中的某一個構造函數(應該為構造函數中的第一條語句)

  2)this(參數):調用本類中另一種形成的構造函數(應該為構造函數中的第一條語句)
  3)super: 它引用當前對象的直接父類中的成員(用來訪問直接父類中被隱藏的父類中成員數據或函數,基類與派生類中有相同成員定義時如:super.變量名 super.成員函數據名(實參)

  4)this:它代表當前對象名(在程序中易產生二義性之處,應使用this來指明當前對象;如果函數的形參與類中的成員數據同名,這時需用this來指明成員變量名)

  5)調用super()必須寫在子類構造方法的第一行,否則編譯不通過。每個子類構造方法的第一條語句,都是隱含地調用super(),如果父類沒有這種形式的構造函數,那麽在編譯的時候就會報錯。

  6)super()和this()類似,區別是,super()從子類中調用父類的構造方法,this()在同一類內調用其它方法。

  7)super()和this()均需放在構造方法內第一行。

  8)盡管可以用this調用一個構造器,但卻不能調用兩個。

  9)this和super不能同時出現在一個構造函數裏面,因為this必然會調用其它的構造函數,其它的構造函數必然也會有super語句的存在,所以在同一個構造函數裏面有相同的語句,就失去了語句的意義,編譯器也不會通過。

  10)this()和super()都指的是對象,所以,均不可以在static環境中使用。包括:static變量,static方法,static語句塊。

  11)從本質上講,this是一個指向本對象的指針, 然而super是一個Java關鍵字。

JAVA中this和super用法