面向对象-继承
繼承:
概念:
- 繼承父類的屬性和行為,使得子類對象可以直接具有與父類相同的屬性、相同的行為。子類可以直接訪問父類中的非私有的屬性和行為。
- 繼承是多態的前提,如果沒有繼承,就沒有多態。
特點:
- java只能單繼承,但可以多層繼承(a繼承b,b繼承c,那么a就有b和c的屬性)
- 老師和學生是人的一種,那么人就是父類,老師學生就是子類(誰是誰的一種)
- 為什么不支持多繼承?
如果是a同時繼承b和c,而且b和c都有一個method方法,那a會懵逼,它不知道用哪個,為了不讓它懵逼,所以不能多繼承,但是可以多層繼承,因為有就近原則
格式:
class 子類 extends 父類 {...} // Java是單繼承的。一個類智能繼承一個類(一個人只有一個親生父母)好處:
1.提高代碼的復用性(相同的代碼不需要重復的寫,只需要提取到父類中,子類可以直接使用)
2.提高代碼的維護性
弊端:
- 耦合性(代碼與代碼之間存在關聯就是耦合)
- 降低代碼的靈活性(繼承了以后子類必須擁有父類的非私有屬性和方法,子類會被約束)
就近原則:
在子類方法中訪問一個變量,采用的是就近原則,先看自己有沒有,沒有就找爸爸要
- 整個流程是這樣:
子類局部范圍找
子類成員范圍找
父類成員范圍找
如果都沒有就報錯(不考慮父親的父親…)
使用場景:
類與類之間存在相同(共性)的內容,就可以使用繼承優化代碼。
比如iPhone是一個手機品牌,huawei是一個手機品牌,Samsung也是一個手機品牌,但都有一個共性就是手機,所以就都可以繼承手機類
案例:
學生類:
- 屬性:姓名、年齡、學習、吃飯、睡覺;
老師類:
- 屬性:姓名、年齡、教書、吃飯、睡覺;
班主任類
- 屬性:姓名、年齡、管理、吃飯、睡覺;
思路:
共同擁有的屬性抽取到父類,子類只需要繼承父類就可以得到這些屬性、方法,子類只需要寫子類特有的方法即可。
// 定義父類 public class Human {private String name;private int age;public void eat(){System.out.println("我是父類的吃方法");}public void sleep(){System.out.println("我是父類的睡覺方法");}// 省略get、set、構造方法}// 定義學生類 public class Student extends Human {public void study(){System.out.println("我是學生類的上課方法");}// 定義老師類 public class Teacher extends Human { public void teach(){System.out.println("我是老師類的上課方法");}} }// 定義班主任類 public class ClassTeach extends Human{public void manage(){System.out.println("我是班主任類的管理方法");} }// 定義測試類public static void main(String[] args) {Teacher teacher = new Teacher();teacher.eat();teacher.sleep();teacher.teach();teacher.setAge(21);teacher.setName("小明");System.out.println(teacher);} }得到結果:
注意:
子類不能繼承父類的構造器,因為子類有自己的構造器。
但是子類可以繼承父類的私有成員(成員變量,方法),只是子類無法直接訪問而已,可以通過getter/setter方法訪問父類的private成員變量。
super:
概念:
this:代表本類對象的引用
super:代表父類存儲空間的標識(可以理解為父類對象引用)
this和super的使用區別:
成員變量:
- this.成員變量 – 訪問本類成員變量
- super.成員變量 – 訪問父類成員變量
成員方法:
- this.成員方法 – 訪問本類成員方法
- super.成員方法 – 訪問父類成員方法
構造方法:
- this(…) – 訪問本類構造方法
- super(…) – 訪問父類構造方法
繼承中構造方法的訪問特點:
通過子類對象訪問一個方法
問題:
- 子類繼承父類出現重名的成員變量時會有變化嗎?
子類繼承父類后,出現重名的成員變量,子類會優先訪問自己的,自己沒有才去訪問父類的 - 子類中所有的構造方法默認都會訪問父類中無參的構造方法
- 為什么要把super()放在第一行
- 子類會繼承父類中的數據,可能還會使用父類的數據。所以,子類初始化之前,一定要先完成父類數據的初始化, 原因在于,子類構造器的第一行都隱含了一個super()去調用父類的無參構造器,super()可以省略不寫。
- 如果父類中沒有無參構造方法,只有帶參構造方法,該怎么辦呢?
注意: this(…)super(…) 必須放在構造方法的第一行有效語句,并且二者不能共存,默認的super();也是在第一行的,只是隱式的而已。
總結
- 上一篇: linux命令行 基础,Linux命令行
- 下一篇: 用pfx证书java双向认证_把CA证书