方法重寫與繼承
繼承
繼承的概念:如果多個類中存在相同屬性和行為時,就可以將這些內容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行 為,只要繼承那個類即可。
格式:class 子類名 extends 父類名 {}
例:
父類:
public class Animal { Animal(int age,String name){ this.age=age; this.name=name; } private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void run(){ System.out.println("跑步"); } }
子類:
public class Cat extends Animal {
Cat(int age,String name){
super(age,name);
}
}
子類:
public class Dog extends Animal {
Dog(int age,String name){
super(age,name);
}
}
測試類:
public class Demo1 { public static void main(String[] args) { Dog dog = new Dog(1,"蓋倫"); Cat cat = new Cat(4,"劍聖"); System.out.println("狗的名字為"+dog.getName()); System.out.println("狗的年齡為"+dog.getAge()); dog.eat(); System.out.println("---------------------------------"); System.out.println("貓的名字為"+cat.getName()); System.out.println("貓的年齡為"+cat.getAge()); cat.run(); } }
輸出為:
狗的名字為蓋倫
狗的年齡為1
跑步
---------------------------------
貓的名字為劍聖
貓的年齡為4
跑步
繼承的好處:提高了程式碼的複用性和維護性,使類與類之間產生關係,是多型的前提。
繼承的弊端:類的耦合性提高了。
開發的原則:高內聚,低耦合。
耦合:類與類的關係。
內聚:就是自己完成某件事情的能力。
Java裡繼承的特點:只支援單繼承,不支援多繼承,但支援多層繼承。
需注意的事項:子類只能繼承父類所有非私有的成員;子類不能繼承父類的構造方法,但是可以通過super關鍵字去訪問父類構 造方法;不要為了部分功能而去繼承。
繼承中成員變數/方法的關係:若子類成員變數/方法名與父類相同,則執行以下步驟:在子類的方法的區域性範圍找,有就使用;在子類的成員範圍找,有就使用; 在父類的成員範圍找,有就使用;如果還找不到,就報錯。
super關鍵字何時使用:當子類區域性範圍需要訪問父類變數時。
super關鍵字代表的是父類儲存空間的標識。
繼承中的構造方法:
子類中所有的構造方法預設都會訪問父類中空引數的構造方法。
原因:因為子類會繼承父類中的資料,可能還會使用父類的資料。所以,子類初始化之前,一定要先完成父類資料的初始 化。
注意:若父類中沒有無參構造方法,則子類應:1.在父類中新增一個無參的構造方法。
2.子類通過super去顯示呼叫父類其他的帶參的構造方法。
3.子類通過this去呼叫本類的其他構造方法,本類其他構造也必須首先訪 問了父類構造。
例:
public class GrandFather { GrandFather(){ } int a1=1; int a2=2; int b1=1; int b2=0; }
public class Father extends GrandFather { Father(){ } public int add(int a1,int a2){ return a1+a2; } public int reduce(int b1,int b2){ return super.b1-super.b2; } }
public class Son extends Father{ public static void main(String[] args) { Son son = new Son(); Son son1 = new Son(); System.out.println(son.add(3,4)); System.out.println(son1.reduce(4,2)); } }
輸出結果為:7
1
分析:Father類中的add方法使用的是傳入的資料,reduce方法使用的是父類中的引數。
方法重寫
何時使用:子類中出現了和父類中一模一樣的方法宣告(方法名,引數列表,返回值型別),也被稱為方法覆蓋,方法複寫。
應用:當子類需要父類的功能,而功能主體子類有自己特有內容時,可以重寫父類中的方法。 這樣,即沿襲了父類的功能,又 定義了子類特有的內容。
注意:父類中的私有方法不能被重寫;子類若要重寫,許可權不能比父類低。
例:
public class Animal {
public void eat(){
System.out.println("吃飯");
}
}
public class Cat extends Animal {
public void eat(){
System.out.println("貓吃魚");
}
}
public class Dog extends Animal {
public void eat(){
System.out.println("狗吃骨頭");
}
}
public class Demo1 {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.eat();
cat.eat();
}
}
輸出為:狗吃骨頭
貓吃魚
final關鍵字:
作用:有時候我們不想讓子類去重寫父類的方法.這時就需要使用 final關鍵字。
作用範圍:可以修飾類,變數,成員方法。
特點:被final修飾的類不能被繼承;被修飾的方法不能被重寫;被修飾的變數不能被重新賦值。
注意:若修飾的是基本型別,則是數值不變;弱修飾引用型別,則是地址值不變