Java super關鍵字:super呼叫父類別的構造方法、利用super存取父類別成員

2020-07-16 10:04:36
由於子類不能繼承父類別的構造方法,因此,要呼叫父類別的構造方法,必須在子類的構造方法體的第一行使用 super() 方法。該方法會呼叫父類別相應的構造方法來完成子類物件的初始化工作。

在以下情況下需要使用 super 關鍵字:
  • 在類的構造方法中,通過 super 語句呼叫該類的父類別的構造方法。
  • 在子類中存取父類別中的成員。

使用 super 呼叫父類別的構造方法

子類可以通過 super 關鍵字來呼叫一個由父類別定義的構造方法,格式如下:
super(parameter-list);
其中,parameter-list 指定了父類別中構造方法所需的所有引數。super() 必須是在子類構造方法的主體第一行。

例如,在 Person 類中指定了兩個構造方法。範例程式碼如下:
public People(String name,int age,String sex,String sn)
{
    this.name=name;
    this.age=age;
    this.sex=sex;
    this.sn=sn;
}
public People(String name,String sn)
{
    this.name=name;
    this.sn=sn;
}

那麼,Student 類繼承了 Person 類,就可以使用 super 語句來定義 Student 類的構造方法。範例程式碼如下:
public Student(String name,int age,String sex,String sn,String stuno,String department)
{
    super(name,age,sex,sn);    //呼叫父類別中含有4個引數的構造方法
    this.stuNo=stuno;
    this.department=department;
}
public Student(String name,String sn,String stuNo)
{
    super(name,sn);    //呼叫父類別中含有兩個引數的構造方法
    this.stuNo=stuNo;
}

從上述 Student 類構造方法程式碼可以看出,super 用來直接呼叫父類別中的構造方法,使用它可以使書寫程式碼更簡潔方便。

使用 super 存取父類別成員

使用 super 存取父類別中的成員與 this 關鍵字的使用相似,只不過它參照的是子類的父類別,基本形式如下:
super.member
其中,member 是父類別中的方法或屬性名稱。這種形式多用於子類的成員名隱藏了父類別中的同名成員的情況。

例 1

在 Animal 類和 Cat 類中分別定義了 public 型別的 name 屬性和 private 型別的 name 屬性,並且 Cat 類繼承 Animal 類。那麼,我們可以在 Cat 類中通過 super 關鍵字來存取父類別 Animal 中的 name 屬性,通過 this 關鍵字來存取本類中的 name 屬性,如下面的程式碼:
//父類別Animal的定義
public class Animal
{
    public String name;    //動物名字
}
//子類Cat的定義
public class Cat extends Animal
{
    private String name;    //名字
    public Cat(String aname,String dname)
    {
        super.name=aname;    //通過super關鍵字來存取父類別中的name屬性
        this.name=dname;    //通過this關鍵字來存取本類中的name屬性
    }
    public String toString()
    {
        return"我是"+super.name+",我的名字叫"+this.name;
    }
    public static void main(String[] args)
    {
        Animal cat=new Cat("動物","喵星人");
        System.out.println(cat);
    }
}

上述程式碼演示了使用 super 實現子類的成員名隱藏父類別中同名成員的情況。儘管 Cat 類中的屬性 name 隱藏了 Animal 類中的 name 屬性,但是 super 允許存取父類別中的 name 屬性。另外,super 還可以用於呼叫被子類隱藏的方法。

執行程式,輸出結果如下:
我是動物,我的名字叫喵星人