- 子類只能繼承一個父類
- 子類會繼承父類的所有域,只是私有域無法訪問與使用
- 父類對象的public域是所有類都可見的,而proteced域只能在本包與它的子類可見(注意的是子類對象只能訪問它從父類繼承的protected域,而不能訪問父類對象的protected域),private域無法直接訪問除非父類提供了public方法去訪問
- 一般情況下父類可以引用子類對象即向上轉型Father father=new son();(因為子類對象中有父類所有的域);而子類不能引用父類對象Son son=new Fahter();(因為父類對象可能沒有子類的所有域)
/** * Manager繼承Person類,Manager中多了private域bonus * 一般情況下父類可以實例成子類即向上轉型(因為子類對象中有父類所有的域),而子類不能實例化成父類(因為父類對象可能沒有子類的所有域) * 特殊情況: * 兩個數組,將persons引用指向managers,兩者公用同一個Manager數組 * 此時用persons[0]=new Person();就會實現父類實例化成為一個子類且不報錯 * 也就是Manager[0]被實例化成Person * 此時Manager[0].getBonus()會報錯,因為調用了不存在的域 */ Manager[] managers=new Manager[2]; Person[] persons=managers; persons[0]=new Person(); managers[0].getBonus();
- 通過強制類型轉換實現子類實例化為父類編譯通過但執行時會報錯java.lang.ClassCastException
Son son=new Son(); Father father=new Father(); son=(Son)father;
- Son instanceof Father->true;Fahter instanceof Son->false
- 當父類引用一個子類對象時,不能直接調用子類中特有的域,而需要強制類型轉換恢復為子類才能調用
public class castClass{ public static void main(String[] argv){ A as[]=new A[2]; as[0]=new A(); as[1]=new B(); ((B)as[1]).getB(); } } class A{ int a; public int getA(){ return a; } } class B extends A{ int b; @Override public int getA(){ return 1; } public int getB(){ return b; } }