先寫父類還是先寫子類:
一般我們在開發中先編寫多個自定義類,寫完之后發現多個類之間存在相同的代碼,此時可以抽取一個父類。
我們以后做開發,都是基於框架/組件來做的,我們是在別人的基礎之上繼續開發。
好比別人提供清水房,我們只需要在清水房的基礎之上裝修,就可以使用。
以后,我們定義新的類回去繼承與框架中/組件中提供的父類。
--------------------------------------------
子類繼承父類之后,可以擁有父類的某些狀態和行為,(子類復用了父類的功能或狀態)。
子類繼承父類的哪些成員(根據訪問修飾符來判斷):
1:如果父類中的成員使用public修飾,子類無條件繼承。
2:如果父類中的成員使用protected修飾,子類也繼承,即使父類和子類不在同一個包中。
3:如果父類和子類在同一個包中,此時子類可以繼承父類中 缺省修飾符的成員。
4:如果父類中的成員使用private修飾,子類打死也都繼承不到。private只能在本類中訪問。
5:父類的構造器,子類也不能繼承,因為構造器必須和當前的類名相同。
-----------------------------------------------------------------------------------
方法重載和方法覆蓋(方法)的區別:
方法重載:Overload
方法重寫:Override
批判,本身二者一點關系都沒有,僅僅只是因為名字很像。
--------------------------------------------
方法重載:Overload
作用:解決了一個類中,相同功能的方法不同的問題。
既然是相同的功能,那么方法的名字就應該相同。
規則:兩同一不同
同類中,方法名相同,可能參數列表不同(參數類型、參數個數、參數循序)。
方法重寫:Override
作用:解決子類繼承父類之后,可能父類的某一個方法不滿足子類的集體特征,此時需要重新在新類中定義
該方法,並重新寫方法體;
規則:一同兩小,一大;
一同:父類和子類的方法簽名是相同的,所以。建議:直接拷貝父類中方法的定義到子類中,在重寫的方法體,就OK了;
--------------------------------------------------------------------
Super關鍵字
需求,在類中的某一個方法中,去調用父類唄覆蓋的方法;
此時的解決方法:使用super關鍵字:
this: 當前對象,誰調用this所在的方法,this就是哪一個對象。
super: 當前對象的父類對象。
------------------------------------------------------------------------
子類初始化過程:創建子類對象的過程:
在創建子類對象之前,會先創建父類對象,
調用子類構造器之前,在子類構造器中,會先調用父類的構造器,
默認調用的是父類無參數構造器....
1:如果父類不存在可以被子類訪問的構造器,則不能存在於子類;
2:如果父類沒有提供無參數構造器,子類必須顯示通過super語句去調用父類帶參數的構造器。
(必須先有父類對象,而后才有子類對象)
(必須先調用父類構造器,而后再調用子類構造器)
例子:
//父類
class Animal{
private String name;//私有 名字
private int age;//私有的字段名 年齡
Animal(String name,int age){
System.out.println("Animal構造器");
this.name = name;
this.age = age;
}
public String getName(){
return name + "," + age;
}
}
//子類
class Fish extends Animal{
private String color;
Fish(String name,int age,String color){
super(name,age);
this.color = color;
}
public void say(){
System.out.println(getName() + "," + this.color);
}
}
//子類初始化過程:創建子類對象的過程
public class EditPlus{
public static void main(String[] args){
Fish f = new Fish("Animal",5,"橙黃色");
f.say();
}
}