Java繼承與向上轉型總結


  • 子類只能繼承一個父類
  • 子類會繼承父類的所有域,只是私有域無法訪問與使用
  • 父類對象的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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM