day14
一、繼承
概念
Java中的繼承是一個對象獲取父對象的所有屬性和行為的機制
理解:繼承是指一個類(子類)可以繼承另一個類(父類)的屬性和方法
關鍵字extends
優點:減少代碼的冗余
缺點:繼承會增加類與類之間的關系,會增加代碼的維護難度
繼承的使用
使用場景:多個類似的類,有相同的屬性和方法,就可以把相同屬性和方法抽取到父類
需求:編寫中國人和日本人的類,創建各自的對象
分析:
人類:
屬性:姓名、性別、年齡
方法:吃飯飯、睡覺覺
中國人的類 繼承 人類 :
屬性:身份證
方法:打太極
日本人的類 繼承 人類:
屬性:年號
方法:拍電影
ps:(省略部分代碼)
public class Person {String name;
char sex;
int age;public void eat(){System.out.println(this.name + "吃飯飯");
}public void sleep(){System.out.println(this.name + "睡覺覺");
}}
// 子類 繼承 父類
public class Chinese extends Person{String id;public void playTaiJi(){System.out.println("中國人打太極");
}}
//創建對象Chinese c = new Chinese();//操作父類屬性c.name = "奇男子";c.sex = '男';c.age = 22;System.out.println(c.name);System.out.println(c.sex);System.out.println(c.age);//操作子類屬性c.id = "1234567890";System.out.println(c.id);//調用父類方法c.eat();c.sleep();//調用子類方法c.playTaiJi();
繼承內存圖
super
理解:
super表示父類
作用:
1.super.屬性:在子類中,調用父類的非私有化的成員屬性
2.super.方法:在子類中,調用父類的非私有化的成員方法
3.super():在子類構造方法中的第一句調用父類的非私有化的構造方法
案例:
繼承的使用的需求案例
封裝父類,添加無參構造、有參構造、get、set方法(都由eclipse直接生成),成員方法保留
經驗
私有化屬性:eclipse工具欄 ------->Source------->Select getters and setters to create—>勾選需要生成屬性的get和set方法;
Source中還有一些自動生成,如構造方法等等;
子類繼承父類,封裝子類,super使用
public class Chinese extends Person{private String id;public Chinese() {
}public Chinese(String name, char sex, int age, String id) {super(name, sex, age);this.id = id;
}public String getId() {return id;
}public void setId(String id) {this.id = id;
}public void playTaiJi(){System.out.println(super.getName() + "打太極");
}}
測試類,有有參構造直接賦值,不用一個個賦值
//創建對象Chinese c = new Chinese("奇男子", '男', 22, "1234567890");//調用父類方法c.eat();c.sleep();//調用子類方法c.playTaiJi();
小結
編寫一個類的步驟:
1.屬性
2.私有化屬性
3.無參構造
4.有參構造
5.get/set方法
6.其他的方法
深入繼承:
思考題:
創建子類對象,會不會調用父類構造方法?
會創建子類對象,會不會創建父類對象?
不會創建子類對象,為什么會調用父類構造方法?
目的是將父類的屬性存放在子類對象中(因為會在子類對象中開辟空間,用于存儲父類的成員屬性)創建子類對象,先調用父類構造方法還是子類構造方法?
先調用子類構造方法創建子類對象,先完成父類構造方法還是子類構造方法?
先完成父類構造方法子類可以繼承父類私有化的屬性和方法嗎?
? 可以,但是只能間接調用
子類對象是否能繼承父類所有的屬性和方法?
? Java官網上,明確表示子類不能繼承父類私有化的屬性和方法,這是站在使用的角度
? 實際上,子類能繼承父類私有化的屬性方法,但是不能直接使用,可以在父類中編寫公有方法去調用私有的屬性和方法
案例:
public class Father {private String fatherAttr = "父類私有化屬性";public Father() {System.out.println("調用父類的構造方法");
}public String getFatherAttr() {return fatherAttr;
}public void setFatherAttr(String fatherAttr) {this.fatherAttr = fatherAttr;
}private void method01(){System.out.println("父類私有化方法");
}public void method02(){method01();
}}
public class Son extends Father{public Son() {//super();//默認實現:調用父類的構造方法System.out.println("調用子類的構造方法");
}}
public class Test01 {public static void main(String[] args) { Son son = new Son();System.out.println(son.getFatherAttr());son.method02();
}}
重寫/復寫
含義:
重寫也叫做復寫,將父類中方法在子類中重新編寫一遍
應用場景:
父類方法不滿足子類需求時,子類就可以重復父類的方法
條件:
1.在子類中重寫父類的方法
2.返回值、方法名、參數列表必須跟父類重寫的方法一致
3.訪問修飾符不能比父類更嚴格
需求:
編寫中國人和日本人的類,創建各自的對象
public class Chinese extends Person{
//省略一部分//@Override -- 重寫的注解
//注解:給程序員和系統解釋代碼信息
@Override
public void eat(){System.out.println(super.getName() + "吃山珍海味");
}
//在測試類new對象調用輸出
總結
1.繼承的使用
2.繼承的深入 — 重要
3.super
4.重寫