在 Java 面向對象-內部私有屬性 中,我們定義了Person
類:
package my.ioc;
public class PrivateField {
public static void main(String[] args) {
Person ming = new Person();
ming.setName("Xiao Ming"); // 設置name
ming.setAge(12); // 設置age
System.out.println(ming.getName() + ", " + ming.getAge());
}
}
class Person {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
現在,假設需要定義一個Student
類,字段如下:
class Student {
private String name;
private int age;
private int score;
public String getName() {...}
public void setName(String name) {...}
public int getAge() {...}
public void setAge(int age) {...}
public int getScore() { … }
public void setScore(int score) { … }
}
仔細觀察,發現Student
類包含了Person
類已有的字段和方法,只是多出了一個score
字段和相應的getScore()
、setScore()
方法。
能不能在Student
中不要寫重複的代碼?
這個時候,繼承就派上用場了。
繼承是面向對象編程中非常強大的一種機制,它首先可以複用代碼。當我們讓Student
從Person
繼承時,Student
就獲得了Person
的所有功能,我們只需要爲Student
編寫新增的功能。
Java使用extends
關鍵字來實現繼承:、
class Person {
private String name;
private int age;
public String getName() {...}
public void setName(String name) {...}
public int getAge() {...}
public void setAge(int age) {...}
}
class Student extends Person {
// 不要重複name和age字段/方法,
// 只需要定義新增score字段/方法:
private int score;
public int getScore() { … }
public void setScore(int score) { … }
}
可見,通過繼承,Student
只需要編寫額外的功能,不再需要重複代碼。
Java只允許一個class繼承自一個類,因此,一個類有且僅有一個父類。只有
Object
特殊,它沒有父類繼承有個特點,就是子類無法訪問父類的
private
字段或者private
方法。例如,Student
類就無法訪問Person
類的name
和age
字段