java基礎(九)繼承
阿新 • • 發佈:2018-11-21
關鍵字: extends
為什麼存在:
多個類存在相同屬性和行為,將其放在一個父類中,其餘的類只需要繼承就行。
提高程式碼複用性
格式:
class 子類名 extends 父類名{}
eg:
Person類:
public class Person {
private int age;
private String name;
public static void eat(){
System.out.println("吃飯");
}
}
Student:
public class Student extends Person {
}
Main:
public class ExtendsDemo {
public static void main(String[] args) {
Student st = new Student();
st.eat();
}
}
好處:
- 提高程式碼複用性
- 子類還可以在父類的基礎上新增新成員
- 提高程式碼的維護性
- 讓類與類之間產生關係,是多型的前提
(這也是弊端,類與類的耦合性很高)
弊端:
- 高耦合
- 可以打破封裝性
拓展:
開發原則:低耦合,高內聚
耦合:類與類的關係
內聚:就是自己完成某件事情的能力
Java中繼承的特點
- java中只支援單繼承,不支援多繼承
class zilei extends fulei,fulei2{} //這種不允許
- 但支援多層繼承
class a
class b extends a{}
class c extends b{}
Java中繼承的注意事項
- 子類不能繼承父類的私有成員方法
繼承非私有方法,裡面如果有私有變數也可以。(打破封裝性)
Person類:
public class Person {
private int age;
private String name;
public static void eat(){
System.out.println(age); //私有成員變數age
}
}
Student:
public class Student extends Person{
}
Main:
public class ExtendsDemo {
public static void main(String[] args) {
Student st = new Student();
st.eat();
}
}
- 子類不能繼承父類的私有成員變數
- 子類不能繼承父類的構造方法,只能通過super關鍵字訪問
- 不要為了部分功能就去繼承
繼承適用場景:
繼承體現的是一種關係: “is a”
假設法
當設計的時候需要你去分析:
比如有張三,李四類,張三 is a Person;李四 is a Person
比如有香蕉,蘋果類,香蕉 is a 水果;蘋果 is a 水果
那就是說如果你覺得ab都屬於c的一種,就可以使用繼承
繼承中成員變數的關係
-
父類中成員變數名稱與子類的不同:不衝突
-
若相同,變數就近原則。變數值為子類中的值
既輸出區域性範圍的變數,還要輸出本類成員範圍中的變數:
父類:
public class Father {
int num = 100;
}
子類:
public class Son extends Father{
int num = 50;
public void show(){
int num = 10;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
Main:
public class ExtendsDemo2 {
public static void main(String[] args) {
Son son = new Son();
son.show();
}
}
輸出為:
10 //輸出的是最近的方法體中的num
50//輸出的是son類中的num
100//輸出的是父類中的num
關鍵字 | 尋值範圍 |
---|---|
this.num | 本類中>父類 |
super.unm | 父類 |
num | 方法體>本類>父類 |
繼承中構造方法的方法
- 子類中所有構造方法執行前都會預設訪問父類中無參構造方法
- 為什麼:子類會繼承父類資料,所以子類初始化之前,一定要完成父類資料的初始化
子類的每個構造方法第一句都是:super(); 不寫也會預設有
public class Student extends Person{
public Student(){
super();
}
}
super(); 可以訪問父類的帶參構造方法