java三大特性----繼承

繼承:

類關係:繼承是兩個類存在is-a的關係,例如,經理 is a 僱員

關鍵字:繼承使用extends關鍵字 例如 class A extends B

爲什麼繼承:代碼複用,可以對父類進行擴展,對父類方法進行重寫

子類繼承父類可以繼承什麼:子類繼承父類非private 的屬性和方法(不是構造方法),但是卻可以通過get,set方法使用父類private的屬性


下面通過例子說明:


public class ExtendsStudy{
public static void main(String[] args) {
//創建了一個經理,但是Manager不能直接的設置name和salery,因爲是父類私有得屬性

Manager m=new Manager();


//此處可以使用公開得set方法進行設置name
m.setName("經理");
m.setSalery(11);
m.setBonus(12);

Employe e=new Employe();


//e.setBonus(12);   //此行代碼報錯,因爲僱員類沒有獎金這個屬性,Bonus是經理特有得屬性


//通過子類進行父類得方法調用,繼承到了飛priavet的方法
int salery=m.getSalery();
}
}
//僱員類
class Employe{
private String name;
//薪水
private int salery;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalery() {
return salery;
}
public void setSalery(int salery) {
this.salery = salery;
}


}
//經理類
class Manager extends Employe{
//獎金
private int bonus;
public int getBonus() {
return bonus;
}
public void setBonus(int bonus) {
this.bonus = bonus;
}

}



因爲經理得薪水是由“薪水”+"獎金"構成,所以父類得獲取薪水得方法對子類不適用,因此需要進行擴展,也就是方法得重寫

public class ExtendsStudy{
public static void main(String[] args) {
Manager m=new Manager();
m.setSalery(12);//設置工資
m.setName("經理");//設置名稱
m.setBonus(11);//設置獎金

//打印經理得總薪水 輸出結果爲:23
//很明顯,m調用的getSalery方法是子類中得方法,而不是父類的方法
//用友繼承關係的子類方法調用,回先再子類中找此方法,如果有則直接調用,如果沒有則去父類中找
System.out.println(m.getSalery());
}
}

//僱員類
class Employe{
private String name;
//薪水
private int salery;


public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalery() {
return salery;
}
public void setSalery(int salery) {
this.salery = salery;
}


}
//經理類
class Manager extends Employe{
//獎金
private int bonus;


public int getBonus() {
return bonus;
}


public void setBonus(int bonus) {
this.bonus = bonus;
}
//對經理獲取薪水得方法進行重寫,獲取重新計算薪水得方法
@Override
public int getSalery(){
int sal=super.getSalery();
return sal+this.bonus;
}

}



不能繼承父類得構造方法:

public class ExtendsStudy{
public static void main(String[] args) {
Manager m=new Manager();
//直接運行,打印出:”父類無參構造函數,子類無參構造函數“
//說明子類無參構造函數在使用得時候會先執行父類無參構造函數,然後再調用子類得構造函數

//運行打印出:”父類無參構造函數 子類有參構造函數“
//說明:子類調用有參構造函數時,同樣是先調用父類無參構造函數,那麼如果父類沒有無參構造函數呢?
Manager m1=new Manager(1);
}
}


//僱員類
class Employe{
private String name;
//薪水
private int salery;


public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalery() {
return salery;
}
public void setSalery(int salery) {
this.salery = salery;
}
public Employe() {
super();
System.out.println("父類無參構造函數");
}



}
//經理類
class Manager extends Employe{
//獎金
private int bonus;


public int getBonus() {
return bonus;
}


public void setBonus(int bonus) {
this.bonus = bonus;
}
//對經理獲取薪水得方法進行重寫,獲取重新計算薪水得方法
@Override
public int getSalery(){
int sal=super.getSalery();
return sal+this.bonus;
}
//子類有參構造函數
public Manager(int bonus) {
System.out.println("子類有參構造函數");
this.bonus = bonus;
}
//子類無參構造函數
public Manager() {
System.out.println("子類無參構造函數");
}
}

 



如果父類不提供無參構造函數會怎麼樣:

將上面得僱員類修改爲:

//僱員類
class Employe{
private String name;
//薪水
private int salery;


public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalery() {
return salery;
}
public void setSalery(int salery) {
this.salery = salery;
}
public Employe(String name, int salery) {
super();
this.name = name;
this.salery = salery;
}

}

子類構造函數直接報錯:這時需要在子類構造函數中手動調用父類有參構造函數。

針對繼承操作不得不說說super關鍵字,例如:

//對經理獲取薪水得方法進行重寫,獲取重新計算薪水得方法
@Override
public int getSalery(){
int sal=super.getSalery();
return sal+this.bonus;

}

        此處如果不加入super,那麼回直接調用子類得getSalery方法,進入死循環。super說明得是父類得getSalery方法


this與super

this是當前類得引用,代表得是當前類,可以直接object=this ,使用的時候可以直接this.field和this.method進行調用,

super指向得是父類,object=super是不成立得,super只是指向父類方法,而不是父類的引用.使用的時候super.constructor和

this.method進行調用




多態:

public class ExtendsStudy{
public static void main(String[] args) {
Manager m1=new Manager();
m1.setName("經理");
m1.setBonus(11);
m1.setSalery(12);
Employe e1=new Employe("小黑", 20);
Employe e2=new Employe("小紅", 30);
Employe [] es=new Employe[3];
es[0]=m1;
es[1]=e1;
es[2]=e2;

for(int i=0;i<es.length;i++){
System.out.println(es[i].getName()+"的薪資爲"+es[i].getSalery());
}
//結果爲:
//經理的薪資爲23
//小黑的薪資爲20
//小紅的薪資爲30

//說明:經理得薪資計算方法是子類中得方法,小黑與小紅得薪資是父類得方法
//當Employe對象在調用getSalery方法得時候,知道當前對象引用得是哪個類型得對象
//一個對象變量可以引用多個對象得現象稱之爲”多態“
//再運行時能夠動態得選擇哪個方法得調用,稱之爲”動態綁定“

}
}


//僱員類
class Employe{
private String name;
//薪水
private int salery;


public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalery() {
return salery;
}
public void setSalery(int salery) {
this.salery = salery;
}
public Employe(String name, int salery) {
super();
this.name = name;
this.salery = salery;
}
public Employe() {
super();
}




}
//經理類
class Manager extends Employe{
//獎金
private int bonus;


public int getBonus() {
return bonus;
}


public void setBonus(int bonus) {
this.bonus = bonus;
}
//對經理獲取薪水得方法進行重寫,獲取重新計算薪水得方法
@Override
public int getSalery(){
int sal=super.getSalery();
return sal+this.bonus;
}
//子類有參構造函數
public Manager(int bonus) {
System.out.println("子類有參構造函數");
this.bonus = bonus;
}
//子類無參構造函數
public Manager() {
System.out.println("子類無參構造函數");
}
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章