Java 常識(013):Java中的super關鍵字

1、Java 中 super 是什麼

java中的super關鍵字是一個引用變量,用於引用直接父類對象。
每當創建子類的實例時,父類的實例被隱式創建,由super關鍵字引用變量引用。

2、爲什麼要用 super 關鍵字

由於子類不能繼承父類的構造方法,因此,要調用父類的構造方法,必須在子類的構造方法體的第一行使用 super() 方法。該方法會調用父類相應的構造方法來完成子類對象的初始化工作。

3、Java 中 super 的用法

java super關鍵字的用法如下:

  • 調用父類的構造方法
  • 訪問父類中實例變量
  • 訪問父類的方法

3.1、使用 super 調用父類的構造方法

Student 類繼承了 Person 類,並且使用 super 來調用 Person 類的構造方法。這裏需要注意一點:
super() 必須是在子類構造方法的第一行。
如果沒有構造函數,編譯器會自動提供默認構造函數。

public class Person {
    /**
     * 姓名
     */
    private String name;
    /**
     * 性別
     */
    private Integer sex;
    /**
     * 年齡
     */
    private Integer age;

    public Person(String name, Integer sex) {
        this.name = name;
        this.sex = sex;
        this.age = 10;
    }

    public Person(String name, Integer sex, Integer age) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
}

public class Student extends Person {

    /**
     * 手機號
     */
    private String mobile;
    /**
     * 聯繫地址
     */
    private String address;

    public Student(String name, Integer sex, Integer age, String mobile, String address) {
        //調用父類三個參數的構造函數
        super(name, sex, age);
        this.mobile = mobile;
        this.address = address;
    }

    public Student(String name, Integer sex){
        //調用父類兩個參數的構造函數
        super(name,sex);
    }
}

3.2、引用父類實例變量

使用 super 訪問父類中的成員變量與 this 關鍵字的使用相似,只不過它引用的父類。 如果父類和子類具有相同的字段,則使用 super 來設置或獲取父類的字段,使用this 來設置或獲取子類的字段

@Data
public class Person {
    /**
     * 姓名
     */
    private String name;
    /**
     * 性別
     */
    private Integer sex;
    /**
     * 年齡
     */
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer sex) {
        this.name = name;
        this.sex = sex;
        this.age = 10;
    }

    public Person(String name, Integer sex, Integer age) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
}


@Data
public class Student extends Person {

    /**
     * 手機號
     */
    private String mobile;
    /**
     * 聯繫地址
     */
    private String address;
    /**
     * 名字
     */
    private String name;

    public Student(String parentName,String name, Integer sex, Integer age, String mobile, String address) {
        //引用父類實例變量
        super.setName(parentName);
        super.setSex(sex);
        super.setAge(age);
        this.name=name;
        this.mobile = mobile;
        this.address = address;
    }

    @Override
    public String toString() {
        return "我是子類的name:"+this.name+"\n"+"我是父類的name:"+super.getName();
    }

示例:

public class SuperDemo {
    public static void main(String[] args) {
        //引用父類實例變量
        Student student = new Student("父類","子類", 1, 10, "15062598456", "中國");
        System.out.println(student.toString());
    }
}

輸出:

我是子類的name:子類
我是父類的name:父類

3.3、調用父類方法

super 關鍵字也可以用於調用父類方法。 如果子類包含與父類相同的方法,則可以使用 super 關鍵字調用父類的方法。

本示例中,Person 和 Student 兩個類都有 whoAmI() 方法,Student 類對該方法進行了重寫,同時使用 super 關鍵字調用了父類中的方法,最後輸出結果如下。

@Data
public class Person {
    /**
     * 姓名
     */
    private String name;
    /**
     * 性別
     */
    private Integer sex;
    /**
     * 年齡
     */
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer sex) {
        this.name = name;
        this.sex = sex;
        this.age = 10;
    }

    public Person(String name, Integer sex, Integer age) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public void whoAmI() {
        System.out.println("我是父類Person");
    }
}
@Data
public class Student extends Person {

    /**
     * 手機號
     */
    private String mobile;
    /**
     * 聯繫地址
     */
    private String address;
    /**
     * 名字
     */
    private String name;
    public  Student(){}

    public Student(String parentName,String name, Integer sex, Integer age, String mobile, String address) {
        //引用父類實例變量
        super.setName(parentName);
        super.setSex(sex);
        super.setAge(age);
        this.name=name;
        this.mobile = mobile;
        this.address = address;
    }

    @Override
    public void whoAmI(){
        super.whoAmI();
        System.out.println("我是子類Student");
    }


}

示例:

 public static void main(String[] args) {        
        Student student = new Student();
        student.whoAmI();
    }

輸出:

我是父類Person
我是子類Student

4、super 關鍵字與 this 關鍵字的區別

  • super 關鍵字:調用基類中的構造函數、成員變量或方法
  • this 關鍵字:調用本類中構造函數、成員變量或方法
  • this 關鍵字:它代表當前對象名(在程序中易產生二義性之處,應使用this來指明當前對象;如果函數的形參與類中的成員數據同名,這時需用this來指明成員變量名)
  • super 關鍵字:必須寫在子類構造方法的第一行,否則編譯不通過。每個子類構造方法的第一條語句,都是隱含地調用super(),如果父類沒有這種形式的構造函數,那麼在編譯的時候就會報錯。
  • super 關鍵字與 this 關鍵字:都指的是對象,所以,不可以在static環境中使用。this 關鍵字在靜態類中使用時,代表的是當前類。

參考資料:
https://docs.oracle.com/javase/tutorial/java/IandI/super.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章