1.定義子類:程序員
關鍵字extends代表正在構造的新類派生與一個已存在的類。已存在的類稱爲超類、基類或父類;新類稱爲子類、派生類或孩子類。超類和子類是Java程序員最經常使用的兩個術語(emmm~~我以爲是叫父類比超類多)。測試
父類Employeethis
public class Employee { private String name; private double salary; private LocalDate hireDay; public Employee(String name, double salary,int year, int month, int day) { this.name = name; this.salary = salary; this.hireDay = LocalDate.of(year,month,day); }
}
子類Manager,經過extends關鍵字繼承父類Employeespa
public class Manager extends Employee{ //獎金 private double bonus; public Manager(String name, double salary, int year, int month, int day) { super(name, salary, year, month, day); this.bonus = 0; } }
在經過擴展超類定義子類的時候,僅須要指出子類與超類的不一樣之處。所以在設計類的時候,應該將通用的方法放在超類中,而將具備特殊用途的方法放在子類中,這種將通用的功能放到超類的作法,在面向對象程序設計中十分廣泛。設計
2.覆蓋方法:code
超類中有些方法對子類並不必定使用。例如Employee(員工)類的getSalary返回薪水的方法並不使用於Manager(經理)類的返回薪水的方法。爲此,須要提供一個新的方法來覆蓋超類中的這個方法。對象
Employee的返回薪水方法以下:blog
public double getSalary() { return salary; }
Manager覆蓋Employee返回薪水的方法以下:繼承
public double getSalary(){ double baseSalary = super.getSalary(); return baseSalary + bonus;//基本工資 + 獎金 }
注意:super只是一個指示編譯器調用超類方法的特殊關鍵字。get
在子類中能夠增長域、增長方法或覆蓋超類的方法,然而絕對不能刪除繼承的任何域和方法。
3.子類構造器:
若是子類的構造器沒有顯示地調用超類的構造器,則將自動地調用超類默認(沒有參數)的構造器。若是超類沒有不帶參數的構造器,而且在子類的構造器中又沒有顯示地調用超類的其餘帶參數的構造器,則Java編譯器將報告錯誤。
public class Employee { private String name; private double salary; private LocalDate hireDay; public Employee(String name, double salary,int year, int month, int day) {//父類的帶參構造器 this.name = name; this.salary = salary; this.hireDay = LocalDate.of(year,month,day); } public double getSalary() { return salary; } }
public class Manager extends Employee{ //獎金 private double bonus; public Manager(String name, double salary, int year, int month, int day) { super(name, salary, year, month, day);//子類顯示調用父類的帶參構造器。 this.bonus = 0; } //設置獎金 public void setBonus(double bonus){ this.bonus = bonus; } }
4.繼承層次:
由一個公共超類派生出來的全部類的集合被稱爲繼承層次。在繼承層次中,從某個特定的類到其祖先類的路徑被稱爲該類的繼承鏈。
5.多態
在Java程序設計語言中,對象的變量是多態的。一個Employee變量既能夠引用一個Employee類對象,也能夠引用一個Employee類的任何一個子類對象,
例如:
Employee e = new Employee(); Employee m1 = new Manager(); Manager m2 = new Manager();
在上面的例子中,m2.setBonus(5000)是能夠調用的,而m1.setBonus(5000)是不能調用的。
即便m1引用的對象是Manager,可是m1的聲明類型是Employee,而setBonus方法並非Employee類的方法。因此不能調用。
m1.setBonus(5000);//編譯錯誤 m2.setBonus(5000);
在Employee m1 = new Manager();這樣的引用叫作向上轉型。即子類的引用指向父類。那麼就只能使用父類的屬性和方法。那麼問題來了,若是向上轉型後子類的引用都調用不了本身的方法了,那咋辦?在子類定義的方法怎麼辦?
此時就要重寫方法了。就是我上面所說的第二小節覆蓋方法,即便向上轉型了,也可以使用父類的方法和子類的方法。
Employee類的messager方法
public void messager(){ System.out.println("我是Employee"); }
Manager類的messager方法
public void messager(){ System.out.println("我是Manager"); }
測試
Employee e = new Employee(); Employee m1 = new Manager(); e.messager(); m1.messager();
結果
我是Employee 我是Manager
總結一下Java多態的必要條件,有三個:
1.繼承:在多態中必須存在繼承的關係
2.重寫:子類重寫父類的方法。那麼在調用其方法時纔會調用到子類的方法。
3.向上轉型:子類的引用指向父類。只有這樣才能夠調用父類的方法(沒有被重寫的方法)和子類的方法(被子類重寫的方法)
歡迎你們在評論區指出不足之處 ~Thanks♪(・ω・)ノ