一、繼承
繼承是java面向對象編程技術的一塊基石,它允許創建分等級層次的類。
繼承就是子類繼承父類的特徵和行爲,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行爲。
繼承就是指在現有類的基礎上,去構建一個新類,新類成爲子類(派生類),原有的類稱爲父類(基類/超類)。
二、繼承的優缺點
優點:
1.提高代碼的複用性。
2.提高代碼的可維護性。
3.提高開發效率。
缺點:
提高了類與類之間的耦合性。
三、繼承的格式
class 父類{
}
class 子類 extends 父類{
}
四、繼承的特性
1.子類擁有父類非private的屬性,方法。
2.子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展。
3.子類可以用自己的方式實現父類的方法。(重寫)
4.Java的繼承是單繼承,但是可以多重繼承,單繼承就是一個子類只能繼承一個父類,多重繼承就是,例如A類繼承B類,B類繼承C類,所以按照關係就是C類是B類的父類,B類是A類的父類。
例1:
//定義手機類
class Phone{
//定義手機的價格
double price = 500;
//手機都能打電話
public void call(){
System.out.println("手機可以打電話");
}
}
//定義具體的手機類:華爲手機類,讓其繼承手機類Phone
class HuaWei extends Phone{
//定義子類特有的方法,在子類中可以直接使用父類的非私有的成員變量
public void show(){
//輸出父類中定義的手機的價格
System.out.println(price);
}
}
//定義測試類
class Test{
public static void main(String[] args){
//創建子類對象
HuaWei hw = new HuaWei();
//因爲繼承了Phone類,所以繼承了父類的屬性和方法,所以可以調用父類中的call()方法
hw.call();
//調用子類特有的方法,輸出父類中定義的手機價格
hw.show();
//子類對象也可以直接調用父類中非私有的成員變量
System.out.println(hw.price);
}
}
如果子類定義了與父類同名的變量,那麼在子類中,或在子類對象的調用中,會優先使用子類本身定義的變量,要想使用父類的,需要使用super關鍵字調用。
例2:
//定義手機類
class Phone_2{
//定義手機的價格
double price = 500;
}
//定義具體的手機類:華爲手機類,讓其繼承手機類Phone
class HuaWei_2 extends Phone_2{
//定義手機的價格,變量名與父類相同
double price = 600;
//定義子類特有的方法
public void show(){
//這裏會優先使用子類本身定義的變量price
System.out.println(price);
//輸出父類的要使用super關鍵字調用
System.out.println(super.price);
}
}
//定義測試類
class Test_2{
public static void main(String[] args){
//創建子類對象
HuaWei_2 hw_2 = new HuaWei_2();
//調用子類特有的方法,輸出子類本身定義的手機價格,和父類中定義的價格
hw_2.show();
//子類對象調用price
System.out.println(hw_2.price);
}
}
在子類中定義了與父類中一模一樣的成員方法(權限大於或等於父類方法的權限),此操作稱之爲方法重寫。
當子類對象調用方法是,會優先調用自己重寫後方法,如果沒有重寫,那麼纔會去調用父類中的方法。
例3:
//定義手機類
class Phone_3{
//定義打電話方法
public void call(){
System.out.println("手機可以打電話!");
}
}
//定義具體的手機類:華爲手機類,讓其繼承手機類Phone
class HuaWei_3 extends Phone_3{
//重寫父類中的打電話方法
@Override
public void call() {
//使用super關鍵字調用父類中的call方法
super.call();
System.out.println("華爲手機當然可以打電話!");
}
}
//定義測試類
class Test_3{
public static void main(String[] args){
//創建子類對象
HuaWei_3 hw_3 = new HuaWei_3();
//優先調用子類重寫後的方法
hw_3.call();
}
}
注意:
被final修飾的類和方法,不能被繼承和重寫!
子類不能繼承父類的構造器(構造方法或者構造函數),如果父類的構造器帶有參數,則必須在子類的構造器中顯式地通過 super 關鍵字調用父類的構造器並配以適當的參數列表。
如果父類構造器沒有參數,則在子類的構造器中不需要使用 super 關鍵字調用父類構造器,系統會自動調用父類的無參構造器。