面向對象上(知識點5:重寫和多態)

1. 構造器當中調用另外一個構造器:

this()調用自身的另外一個構造器

super()調用父類的另外一個構造器

必須寫在第一行,所以這兩個是不可能同時出現的

2. 子類重寫父類方法的時候,要遵循“兩同兩小一大的規則”

兩同:方法名相同,形參列表相同

兩小:子類方法的返回值類型應該比父類的方法的返回值類型更小或者相等

         子類方法聲明拋出的異常應該比父類方法聲明的拋出的異常類更小或者相等

一大:子類方法的訪問權限應該比父類方法的訪問權限大

里氏替換原則:子類中方法的前置條件(形參)必須與超類中被覆寫的方法的前置條件相同或者更加寬鬆

                       重寫或實現父類的方法時輸出結果可以被縮小

3. 重寫的方法要麼都是類方法要麼都是實例方法,不能一個是類方法,一個是實例方法,如下就是錯誤的

A類:public static void test();
B類(繼承A類):public void test();

但是如果這樣就是正確的,但是這樣子test就是B類的新方法了,與A沒有關係,也不是重寫

A類:public void test();
B類(繼承A類):public static void test();

4.多態(編譯時類型和運行時類型不一致纔會有多態),比如下面Sub是Base的子類

Base:成員變量——public int book=6

           方法——public void base()和public void test()

Sub:  成員變量——public String book="xxxxxx"

           方法——public void sub()和public void test()

Base b=new Sub();//編譯時類型是Base,運行時類型是Sub

  • b.book   //6
  • b.base()//ok
  • b.sub//不可以調用
  • b.test()//實際運行時調用的是Sub重寫過的test

總結:編寫代碼的時候,只允許調用編譯時類型所定義的成員變量和方法

          運行代碼的時候,如果子類重寫了父類的某個方法,那麼調用的將會是被子類重寫過的那個方法

          實例變量是不具備有多態性的,總是訪問的是編譯時類型所定義的成員變量

如果想要在編寫代碼的時候,讓引用變量調用運行時類型的方法,那麼要把他強制轉換成運行時類型

比如:Base b=new Sub();   Sub s=(Sub)b;

但是如果你這樣子寫Base b=new Base();   Sub s=(Sub)b;那麼就是錯的,因爲b的編譯時類型和運行時類型都是Base,所以如果將父類實例轉化成子類實例時,這個對象必須編譯時爲父類類型,運行時類型爲子類類型,否則會有ClassCastException,所以可以使用instanceof運算符。

語法:引用類型變量 instanceof 類/接口。

前面的要是後面的類、子類、實現類的實例纔是true





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