1. 程式人生 > >super,this的區別和使用

super,this的區別和使用

this的使用和說明

java的this關鍵字只能用於方法體內,java虛擬機器(JVM)會給這個物件分配一個引用自身的指標,這個指標的名字就是this.

注意:函式引數或者函式中的區域性變數和成員變數同名的話,成員變數被遮蔽,此時要訪問成員變數則需要使用“this.成員變數”的方式引用成員變數,如果沒有同名的情況下,可以直接使用。
這裡寫圖片描述

執行結果

張三 25
Tom
5432112345

super的使用和說明

super關鍵字的作用是用於子類引用父類的成員,如屬性、方法或者構造器。

  • 呼叫父類構造器

基本格式是:super([arg_list]);

直接用super()加上父類構造器所需要的引數,就可以呼叫父類的構造器了。如果父類中有多個構造器,系統自動根據super()中引數個數和引數型別類匹配父類中的構造器。

需要注意的是如果子類中沒有顯式地呼叫父類中無引數的構造器,也沒有在構造器中呼叫過載的其它構造器,則系統將會預設呼叫父類中無引數的構造器。此時如果父類中沒有無參的構造器,則編譯將會出錯。

子類中的成員方法在使用super的時候,一般儘可能的使用private私有化。

子類構造方法呼叫父類的構造方法一般用super(引數列表)的方式呼叫,引數不是必須的。同時還要注意,super(引數列表)這條語句只能用在子類構造方法體中的第一行。

  • 呼叫父類方法、屬性

當super用於引用父類的屬性或方法時,使用下面的格式:
super.屬性
super.方法([arg_list])
注意,在這個時候,父類的屬性或方法必須是那些protected或者public等可以讓子類訪問的屬性或者方法。

案例分析

public class Father {
    public String v = "父類Father";
    public String x = "父類的成員變數";

    public Father()
    {
        System.out.println("Father無參構造方法被呼叫");
    }
    public Father(String v)
    {
        this.v = "Father有參構造方法被呼叫";
    }
    public void showMessage()
    {
        System.out.println("Father的showMessage()方法被呼叫"
); } public static void main(String args[]) { //自動生成存根方法 } }
public class Son extends Father {
    public String v = "子類Son";
    public Son()
    {
        //呼叫父類的構造方法,且只能放在第一行
        super();
        System.out.println("Son的無參構造方法被呼叫");
    }
    public Son(String str)
    {
        super(str);
        System.out.println("Son的有參構造方法被呼叫");
    }
    //覆蓋了父類的成員方法showMessage()
    public void showMessage()
    {
        System.out.println("Son的showMessage()方法被呼叫");
    }

    public void test()
    {
        String v = "區域性變數v覆蓋了成員變數v和超類變數v";

        System.out.println("---------------------------");
        System.out.println("子類區域性變數v="+v);
        System.out.println("子類成員變數v="+this.v);
        System.out.println("父類成員變數v="+super.v);
        System.out.println("子類繼承而來的超類成員變數x="+x);
        System.out.println("超類成員變數x="+super.x);
        System.out.println("---------------------------");
        showMessage();//呼叫子類的showMessage()方法
        this.showMessage();//呼叫子類的showMessage()方法
        super.showMessage();//呼叫父類的showMessage()方法
    }

    public static void main(String args[])
    {
        Son son =new Son();
        son.test();
    }
}