上節課先學習了兩個訪問修飾符:公有public和私有private
接着,學習了定義公開方法(Getter和Setter)
然後,通過公開方法間接訪問私有屬性
最後,學習了靜態和非靜態成員的區別
接下來學習繼承,繼承是面向對象編程另一個重要的特徵。
01/ 繼承
繼承是指子類從父類那裏獲得屬性和方法的過程。
繼承的一般語法格式為:class 子類 extends 父類
在這個過程中,子類會繼承父類的公有屬性和方法(不能繼承私有屬性),在此基礎上,還可以添加屬於自己的新屬性和方法。
它們之間的關係:父類更通用,子類更具體。比如,我屬於人類,也屬於學生。在這裏,人類是父類,學生是子類。
理解過程
舉例説明:定義一個Person類,兩個公開屬性:姓名和年齡,一個構造方法,一個普通方法。
class Person {
public String name;// 姓名
public int age;// 年齡
public Person(String name, int age) {
this.name = name;
this.age = age;
}// 構造方法
public void displayInfo() {
System.out.println("姓名: " + name);
System.out.println("年齡: " + age);
}//普通方法
}
子類繼承父類的過程,例:
class Person {
public String name;// 姓名
public int age;// 年齡
public Person(String name, int age) {
this.name = name;
this.age = age;
}// 構造方法
public void displayInfo() {
System.out.println("姓名: " + name);
System.out.println("年齡: " + age);
}// 普通方法
}
// extends關鍵字表示一個類繼承另一個類,子類在前,父類在後
class Student extends Person {
public String ID;// 添加新屬性
public Student(String name, int age, String ID) {
super(name, age);
this.ID = ID;
}// 添加構造方法
public void displayStudentInfo() {
displayInfo();
System.out.println("學號: " + ID);
}// 添加方法
}
注意事項
父類有三類成員不能被繼承,私有成員、靜態成員和構造方法。
私有成員:無法繼承,但可以通過父類提供公共接口或方法(如Getter和Setter方法)來間接訪問。
private String name;
靜態成員:屬於類本身,無法繼承,但子類可以使用類名訪問父類的靜態成員,比如Student.age
public static int age;
構造方法:無法繼承,可以通過super關鍵字調用父類的構造方法
class Person {
private String name;
public static int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}// 父類的構造方法
...
}
class Student extends Person {
...
}
super關鍵字:
class Person {
private String name;
public static int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
...
}
class Student extends Person {
public String ID;
public Student(String name, int age, String ID) {
super(name, age);// 在子類的構造方法中,使用super關鍵字,可以調用父類的構造方法,括號內是傳遞給父類構造方法的參數。
this.ID = ID;
}
...
}
例題:
// 父類
class Person {
public String name;// 姓名
public int age;// 年齡
public Person(String name, int age) {
this.name = name;
this.age = age;
}// 構造方法
public void displayInfo() {
System.out.println("姓名: " + name);
System.out.println("年齡: " + age);
}// 普通方法
}
// 定義一個類Student,繼承自Person
class Student extends Person {
public String ID;// 屬性
public Student(String name, int age, String ID) {
super(name, age);
this.ID = ID;
}// 構造方法
public void displayStudentInfo() {
displayInfo();
System.out.println("學號: " + ID);
}// 定義顯示學生信息的方法displayStudentInfo()
}
public class MyTest {
public static void main(String[] args) {
// 創建Student類的對象實例
Student student = new Student("小白", 21, "000001");
// 調用顯示學生信息的方法
student.displayStudentInfo();
}
}
02/ super和this的區別
存在的問題:在繼承中,子類和父類出現同名變量是一種常見情況,然而,這種情況可能導致混淆,使人難以確定訪問的是哪個變量。
class Parent {
public String name = "父類屬性";
}
class Child extends Parent {
public String name = "子類屬性";
public void display() {
System.out.println(name);
}
}
解決問題
為了避免歧義和提高代碼可讀性,就需要合理的使用super和this關鍵字。
從字面含義上很好了理解:
super字面意思是“超越”,在Java中它代表超類(也叫父類);
this字面意思是“這個”,指的是當前的實例對象。
super
在子類中,super用於引用父類的成員(屬性、方法和構造方法)。
除了約定使用super()調用父類的構造方法外,我們還可以使用super.屬性和super.方法()的方式來訪問父類的屬性和普通方法。
在子類的方法中,我們使用super.name,表示使用超類(父類)的name屬性。
class Parent {
public String name = "父類屬性";
}
class Child extends Parent {
public String name = "子類屬性";
public void display() {
System.out.println(super.name);
}
}
this
在類中,this用於引用當前對象的成員(屬性和方法)。
在display()方法中,我們使用this.name,表示使用當前對象的name屬性。
class Parent {
public String name = "父類屬性";
}
class Child extends Parent {
public String name = "子類屬性";
public void display() {
System.out.println(this.name);
}
}
例題:
class Parent {
public String name = "父類屬性";
}
class Child extends Parent {
public String name = "子類屬性";
public void display() {
// 輸出父類Parent的name屬性
System.out.println(super.name);
// 輸出子類Child的name屬性
System.out.println(this.name);
}
}
public class MyTest {
public static void main(String[] args) {
// 創建一個Child的實例對象child
Child child = new Child();
// 調用child對象的display()方法
child.display();
}
}
// 輸出
父類屬性
子類屬性
03/ 總結
- 理解繼承概念,子類繼承父類的過程,父類的私有成員,靜態成員,構造方法無法繼承。在子類中,可以super關鍵字調用父類構造方法。
- 理解super和this的區別,super.屬性名是調用父類的屬性,this.屬性名是調用子類的屬性。