## 定義類型
應該將通用的方法放在基類當中.而具有特殊作用的方法放在子類當中.
## 覆蓋方法
可以對父類的同名方法進行重寫.
## 子類構造器
調用父類構造器必須寫在子類構造器的第一行,如果沒有顯示的調用父類構造器,子類將自動的掉用哪個一個無參數的父類構造器.如果父類沒有不帶參數的構造器,而子類又沒有顯示的調用父類構造器,那么java編譯器將會報錯.
~~~
Manager boss = new Manager("jack");
Employee[] staff = new Employee[2];
staff[0] = boss;
staff[1] = new Employee("milan");
for (Employee e : staff) {
System.out.println(e.getName());
}
~~~
Manager 類繼承自Employee, 調用能夠確定應該執行哪個 getSalary 方法。 請注意, 盡管這里將 e 聲明為 Employee 類型, 但實際上 e 既可以引用 Employee 類型的對象, 也可以引用 Manager 類型的對象。
當 e 引用 Employee 對象時, e.getSalary( ) 調用的是 Employee 類中的 getSalary 方法; 當 e 引用 Manager 對象時, e.getSalary( ) 調用的是 Manager 類中的 getSalary 方法。 虛擬機知道 e 實際引用的對象類型, 因此能夠正確地調用相應的方法。
一個對象變量(例如, 變量 e) 可以指示多種實際類型的現象被稱為多態(polymorphism)。 在運行時能夠自動地選擇調用哪個方法的現象稱為動態綁定(dynamic binding。)
## 繼承層次
一個基類可以無限的被子類繼承,形成一個繼承鏈.java只支持單繼承.
## 多態
有一個用來判斷是否應該設計為繼承關系的簡單規則,這就是"is-a" 規則,它表明子類的每個對象也是超類的對象.例如,每個經理都是雇員,因此,將Manager類設計為Employee類的子類是顯而易見的,反之不然,并不是每一名雇員都是經理.
"is-a"規則的另一種表述法是置換法則.它表明程序中出現超類對象的任何地方都可以用子類對象置換.
## 受保護訪問
在實際使用中,避免濫用protected.盡量不要對域設置protected,而是對方法設置protected.