1. 程式人生 > >Java多型

Java多型

向上轉型

又稱隱式轉型、自動轉型

父類引用指向子類例項,可以呼叫子類重寫父類的方法以及父類派生的方法,無法呼叫子類獨有方法

小類轉型為大類

父類的靜態方法不允許子類重寫,只能呼叫父類原有的靜態方法

如果一定要呼叫子類中的靜態方法就需要向下轉型後再呼叫

向下轉型

又稱強制型別轉換

子類引用指向父類物件,此處必須進行強轉,可以呼叫子類特有的方法

必須滿足轉型條件才可以強轉(子類之間不能互相轉換)

instanceof運算子:用於判斷左邊的類是否是右邊的類的子類,返回true/faluse

抽象類

通過abstract關鍵字修飾的類稱為抽象類(放在class前面)

抽象類不允許直接例項化,可以通過向上轉型,指向子類例項

應用場景:某個父類只是知道其子類應該包含怎樣的方法,但無法準確知道這些子類如何實現這些方法。

抽象方法

方法前加上abstract後方法成為抽象方法

抽象方法不能有方法體,即不需要大括號和裡面的程式碼,要在原來的方法名後加分號

子類必須重寫父類的抽象方法

抽象子類不需要重寫父類的抽象方法

抽象類&抽象方法

使用規則:

1.abstract定義抽象類

2.抽象類不能直接例項化,只能被繼承,可以通過向上轉型完成物件例項

3.abtract定義抽象方法,不需要具體實現

4.包含抽象方法的類一定是抽象類

5.抽象類中可以沒有抽象方法

6.static\final\private 不能與abstract並存

介面

通過implements關鍵字實現

介面訪問修飾符:public\預設 。 只能寫這兩種不能寫別的

介面中抽象方法可以不寫abstract關鍵字

介面內方法系統預設public的訪問許可權

實現類如果不是抽象類就要實現介面中所有的方法,如果是抽象類就不需要

介面中可以包含常量,預設public static final。

如在介面中 int temp = 20;就相當於public static final int temp = 20;

介面和實現類存在同名資訊時,用介面例項化一個實現類後呼叫的同名資訊是接口裡的

介面可以實現多繼承,即一個子介面可以同時繼承多個父介面

一個類可以繼承自一個父類,同時實現多個介面

預設方法和靜態方法

default:預設方法,寫在方法前面可以使介面中的方法帶方法體

可以在實現類中重寫並通過介面的引用呼叫

static:靜態方法,可以帶方法體

不可以在實現類中重寫可以通過介面名呼叫

靜態方法需要通過介面名去呼叫

介面.super.方法:表示呼叫介面中預設的方法

不加super只能訪問介面中的靜態成員

多介面中重名預設方法處理的解決方案

實現類必須重寫一個滿足自己特徵的方法

如果這個類已經繼承自父類那麼預設情況下會直接呼叫父類的重名方法。

關於多重介面名常量處理的解決方案

父類屬性與介面中常量同名時:程式無法自動辨別,需要在子類中重新定義那個重名變數才能正常使用

內部類

一個類定義在另一個類裡面或者一個方法裡面,稱為內部類

包含內部類的類稱為外部類

作用:更好地實現了資訊隱藏

分類:成員內部類、靜態內部類、方法內部類、匿名內部類

成員內部類

獲取內部類物件例項:

方式1:外部類.內部類 物件名= new 外部類.new 內部類

方式2:物件名 = 外部類物件.new 內部類

方式3:物件名 = 外部類物件.獲取方法

內部類在外部使用時,無法直接例項化,需要藉由外部類資訊才能完成例項化

內部類的訪問修飾符可以任意,但是訪問範圍會受到影響

內部類可以直接訪問外部類的成員;如果出現同名屬性,優先訪問內部類中定義的

可以使用外部類.this.成員的方式,訪問外部類中同名的資訊

外部類訪問內部類資訊需要通過內部類例項,無法直接訪問

內部類編譯後.class檔案命名:外部類$內部類.class

靜態內部類

1.靜態內部類中,只能直接訪問外部類的靜態方法,如果需要呼叫非靜態方法,可以通過物件例項化

2.靜態內部類物件例項時可以不依賴於外部類物件

3.可以通過外部類.內部類,靜態成員的方式訪問內部類中的靜態成員

4.當內部類屬性與外部類屬性同名時預設直接呼叫內部類中的成員;如果需要訪問外部類中的靜態屬性,可以通過外部類.屬性的方式;如果需要訪問外部類中的非靜態屬性,可以通過new 外部類().屬性的方式

方法內部類

定義在外部類方法中的內部類,也稱區域性內部類

1.定義在方法內部,作用範圍也在方法內

2.和方法內部成員使用規則一樣,class前面不可以新增public、private、protect、static

3.類中不能包含靜態成員

4.類中可以包含final\abstract修飾的成員

匿名內部類

將類的定義和建立放到一起完成

類名 物件名 = new 構造方法();

語法:

test.getRead(new Person(){
    
    @Override
    public void read() {
        System.out.println("...");
    }
});

優點:對記憶體和系統性能影響較小

缺點:只能呼叫一次

適用場景:

1.只用到類的一個例項

2.類在定義後馬上使用

3.給類命名並不會導致程式碼更容易被理解

匿名內部類編譯後生成的.class檔案命名為外部類名$1(2,3……).class

匿名內部類沒有型別名稱、例項物件名稱

無法使用private/public/protect/abstract/static修飾

無法在匿名內部類編寫構造方法,但可以通過構造程式碼塊完成初始化

匿名內部類中不能出現靜態成員

可以實現介面,也可以繼承父類,但不可兼得