從某個class 繼承屬性 方法 等直接使用,不用另外宣告。
被繼承的類稱為superclass。繼承的類稱為subclass。下面統一會以這兩個英文作為代稱。
格式:
subclass extends superclass {}
public Person {
String name;
int age;
public String getInfo() {
return "name is = " + name + ", age is = " + age);
}
}
public Student extends Person {
String school;
}
可以從兩種方式進行繼承的設計:
Person 接著從Person 中找到有關聯可以被繼承的部分後,接著再定義Student )。繼承的部分,如耗電量、廠牌等等,再定義一個電器的類,讓這些這些電器可以繼承)。繼承的好處:
💡在使用繼承時可以使用"is-a"的方式去思考符不符合繼承的關係
💡不要為了為了繼承而繼承
💡例如狗和貓都很多共同的屬性,就讓貓成為狗的superclass
當superclass的屬性或方法使用private 進行封裝時,subclass也是會一併繼承這些屬性或方法 ,但是沒有權限使用。
superclass可以被多個subclass``繼承、但是一個類只能有一個superclass,一個類繼承另一個類以後,它還可以被其他的類繼承。
這樣是可以的:
public A {}
public B extends A {}
public C extends B {}
這樣是不可以的:
public A {}
public B {}
public C extends A , B {}

一個類只能有一個super class,無法同時繼承多個class,但是可以多層的繼承。
例如:
多層的繼承。多個繼承。(D已經繼承A的情況下,就無法再繼承B)封裝 的權限 private default protected public 中的protected 權限是公開到subClass
public Person {
String name;
int age;
protected String phone;
public String getInfo() {
return "name is = " + name + ", age is = " + age);
}
}
public Student extends Person {
String school;
}
// 假設在不同的package中
import com.person.Person
public StudentTest {
public static void main(String[] args) {
Student student1 = new Student();
student1.phone = "0912345678";
Person person = new Person();
// 無法使用
person.phone = "0998765432";
}
}
由於StudentTest並不是Person 的subclass,且也不在同一個package 中,所以它沒有辦法使用Person 中宣告為protected 的phone 屬性
override指的是當subclass將從superclass``繼承方法中的程式碼進行重寫。
例如:
public Person {
String name;
int age;
protected String phone;
public String getInfo() {
return "name is = " + name + ", age is = " + age);
}
}
public Student extends Person {
String school;
public String getInfo() {
return "這是被重寫過的getInfo method";
}
}
若是繼承的方法有overload時,只要參數的內容相同即可只重寫那一個方法,其餘的一樣會繼承。
有幾個需要注意的部分:
superclass``方法的權限修飾符。例如:💡這樣是錯誤的無法重寫
public Person {
String name;
int age;
protected String phone;
protected String getInfo() {
return "name is = " + name + ", age is = " + age);
}
}
public Student extends Person {
String school;
String getInfo() {
return "這是被重寫過的getInfo method";
}
}
protected 的權限相對於default(沒有寫任何權限) 的權限還大,這樣是無法重寫的。
權限由小到大:
private (只有自身類可以使用)→ default (相同package 可以使用)→ protected (繼承的subclass可以使用) → public (任何類都可以使用)
void:必須也是void。基本數據類型:必須跟superclass相同。(即便可以提昇也不能)引用類型:該類型必須至少是superclass返回類型的subclass,或與superclass相同。基本數據類型:
public Person {
int age;
public int getAge() {
return age;
}}
public Student extends Person {
// 這樣不行
/*
public double getAge() {
return age;
}
*/
//這樣可以
public int getAge() {
age += 5
return age;
}
}
引用數據類型:
// Person class
public Person {
public Person getPerson() {
}
}
// Student class
public Student extends Person {
public Student getPerson() {
}
}
superclass異常類型的subclass或相同。super指的是當繼承了superclass的屬性或方法時,還是需要使用superclass的屬性或方法,可以使用super去改成調用superclass的屬性或方法,但是使用super時還是會受到權限的限制。
例如:
public Person {
String name;
int age = 20;
protected String phone;
public String getInfo() {
return "name is = " + name + ", age is = " + age);
}
}
public Student extends Person {
int age = 10;
String school;
public void printAge() {
System.out.println(age); // 10
System.out.println(super.age); // 20
}
public String getInfo() {
super.getInfo();
return "這是被重寫過的getInfo method";
}
}
當在屬性或方法前面加上super. 時,會直接去superclass找符合的屬性或方法。
若是在構造器中使用時,super 必須放在構造器中的第一行(跟this)一樣,並且this 和super 只能擇一使用。
public Person {
String name;
int age = 20;
public Person() {
}
public Person(String name, int age) {
this .name = name;
this.age = age;
}
}
public Student extends Person {
int age = 10;
String school;
public Student() {
super();
}
public Student(String name, int age) {
super(name, age);
}
}
subclass的構造器 中,一定會有其中一個是使用super 去調用superclass的構造器