文章目錄
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