Java多型細節與instanceof關鍵字
阿新 • • 發佈:2019-02-17
多型
無繼承,無多型
多型作為OOP三大特性之一,在現實生活中,表現為一個物件可以有多種形態
OOP語言中也就是一個物件對應著不同型別,程式碼的直接體現在於父類或者介面的引用指向其子類的物件
- 好處
提高了程式碼的擴充套件性,前期定義的程式碼可以使用後期的內容
比如下面新增其他具體動物類,都可以實現eat()方法,父類引用型變數繫結通過不同的物件呼叫同名的不同方法
- 弊端
前期定義的內容不能使用後期子類的特有內容
比如每個具體的func特有功能方法,那麼Animal型別變數就無法訪問,必須向下轉換為子類物件
- 物件型別的隱式轉換和顯示轉換
首先,對於物件轉型,都是子類物件向上轉換或父類父類物件向下轉換(實際上基本資料型別的型別轉換也可以看成物件型別轉換,比如Integer其實就是int的型別)
向上轉換
向下轉換:是為了使用子類的特有功能
沒有繼承關係的類之間的轉換會報錯
instanceof 關鍵字
instenceof 用於判斷物件的具體型別,只能用於引用資料型別的判斷,確保源物件是否為目標物件的例項
一般用於健壯性的判斷:要使用子類特有功能須向下轉型,一般要先判斷物件型別
- 多型使用的前提
1.必須有關係:繼承、實現
2.要有覆蓋
關於多型成員的特點請看另一篇:多型成員的特點
abstract class Animal //也可以換成介面
{
abstract void eat();
}
class Cat extends Animal
{
void eat()
{
System.out.println("貓愛吃魚");
}
void catFunc()
{
System.out.println("貓抓老鼠");
}
}
class Dog extends Animal
{
void eat()
{
System.out.println("狗愛吃骨頭");
}
void dogFunc()
{
System.out.println("狗看門");
}
}
class Cattle extends Animal
{
void eat()
{
System.out.println("牛愛吃草");
}
void cattleFunc()
{
System.out.println("牛耕田");
}
}
class Polymorphism
{
public static void main(String[] args)
{
Animal a = new Cat();//自動型別提升,cat物件提升為了Animal(向上轉型),但是特有功能無法訪問
eatMethod(a);
((Cat)a).catFunc();//若要使用子類中的特有功能,必須向下轉換注意括號不可少,先轉換,再.操作
//對於轉型,都是子類物件向上轉換或父類父類物件向下轉換
}
public static void eatMethod(Animal a )
{
a.eat();
if( a instanceof Cat)//instenceof 用於判斷物件的具體型別,只能用於引用資料型別的判斷,確保源物件是否為目標物件的例項
((Cat)a).catFunc();
if( a instanceof Dog)
((Dog)a).dogFunc();
if( a instanceof Cattle)
((Cattle)a).cattleFunc();
}
}