1. 程式人生 > >Java多型細節與instanceof關鍵字

Java多型細節與instanceof關鍵字

多型

無繼承,無多型
多型作為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(); } }