多態
多態:同一個類型使用不同的的類型的實例來表現不同的操作。
即 父類可以兼容子類的實例 或者 接口接受實現類的實例
//父類兼容子類的實例
Parent p = new Child();
//接口接受實現類的實例
class A implements B;
B b = new A();
實現多態的過程中,父類是無法訪問子類新增的屬性 和 方法。
使用多態時,調用的方法取決於實例對象的類型。
多態的使用方式:
1、將父類作爲參數進行傳遞,該方式主要用於設計框架的底層結構
2、子類重寫父類的方法,使用父類調用子類實例的重寫方法
類型轉換異常:classCastException
注意點:
子類不能接受父類的實例,由於子類會比父類有更多的屬性和方法,因此會導致子類無法在父類的實例中找到子類新增的屬性和方法的引用。
由於當前Parent類型引用了Child的實例,因此此次轉換相當於 (Child) new Child()
Parent p = new Child();//裝箱
Child c = (Child) p; //拆箱
拆箱的父類實例必須是拆箱轉換的實例類型,因此拆箱時會對實例類型先進行判斷 --------------instanceof-----------
box instanceof Pen;//此處的Pen就是要判斷的類型,判斷box是不是Pen類型
父類也可以接受子孫類的實例。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
接口(第二種實現多態的方式)
接口是Java中的數據類型,用於對指定的數據內容進行規範設計。
使用目的:
1、實現數據類型的標準化(統一化)
2、接口是面向對象中純粹的多態性的設計
注意點:
接口不能實例化;
接口中的方法是抽象方法,默認使用public abstract 且必須是公共的
類通過implements實現接口
接口的屬性
接口中的屬性默認使用public static final 來修飾,且必須使用該類修飾符
接口中的屬性都是公共靜態的常量
常量必須在聲明時進行賦值,且無法對值進行修改。
final
final修飾的屬性都將成爲常量
final修飾方法將導致方法不能被重寫
final修飾類將導致類無法被繼承
public static final 修飾符不分先後順序,一般這樣寫
如果其父類實現了接口,則也能通過類的子類達到多態的目的。
一個類可以繼承父類並對接口進行實現,要求必須先繼承父類,再實現接口。
接口可以多實現
一個類可以同時實現多個接口,以逗號分隔,實現多個接口後,每個接口的抽象方法都要實現。
public class A extends B implements C, D{
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
抽象類
兼顧了接口和實例類的特點
抽象類不能實例化,並且只能通過繼承來使用。
繼承的抽象類可以明確提醒子類重寫某個方法。
抽象類存在實例方法和抽象方法
public abstract class XX{
//實例方法
public void A(){
}
//抽象方法
public (abstract) void B();
}