2013-02-25 61 views
1

如果我有一個名爲Animal的超類,而子類叫做Cat,Dog,Bird。Java:使用getClass獲取子類引用

如果我讀了一組動物,並且想要訪問一個名爲meow()的Cat特定方法,我該怎麼做?

我知道我可以使用的getClass()來找出動物的子類,但我如何使用它來創建一個參考訪問喵()

+0

您可能必須更改爲使用'instanceof',因爲您可能也已經劃分了'Cat'類,您可能還想調用'meow'方法。 – 2013-02-25 03:51:17

+0

感謝您的所有意見。 – stumped 2013-02-25 06:39:36

回答

1

可以轉換爲Cat

if (animal.getClass().getName().equals('Cat')) { 
    ((Cat)animal).meow(); 
} 

或者你可以使用instanceof


這兩種解決方案都很醜陋,而且Java並沒有被設計用於這種方式。相反,您應該爲可以在內部調用Cat.meow的動物創建一個.speak方法。

+0

如果我有一個speak()方法,並且我有20個動物子類,並且我必須動態地引用Cat的說法,那麼我該怎麼做?對於所有20只動物,我不能擁有getClass.equals()。 – stumped 2013-02-25 03:27:12

+0

@stumped你是說你只*想讓貓說話嗎? – 2013-02-25 03:28:02

+0

不,我的意思是,我讀動物數組,說有100個動物子類,我需要找出它是哪個子類,然後調用它的說話方法。我不知道如何動態創建子類引用。 – stumped 2013-02-25 03:32:33

0

就像這個...

if (animal.getClass().getName().equals('Cat')) { 
    ((Cat)animal).meow(); 
} 

if (animal instanceof Cat) { 
    ((Cat)animal).meow(); 
} 
+0

但是,如果您只知道它是從getClass() – stumped 2013-02-25 03:23:55

+0

動態查看更新回答。 – xagyg 2013-02-25 03:28:24

0

一旦找到想要使用的子類,就可以對其進行強制轉換。在你的情況下,將

((Cat)animals[index]).meow(); 
2

如果您正在使用的animal秒的數組,你需要檢查你正在使用的對象是否爲Cat類的實例,這可以通過使用instanceof操作來實現。然後我們可以使用downcasting運算符將Animal轉換爲Cat,然後調用meow()方法。

if(animal instanceof Cat){ 
    (Cat)animal.meow() 
} 

使用數組

Animal [] animals = []; 
foreach(Animal animal: animals){ 
    //do something 

    if(animal instanceof Cat){ 
     (Cat)animal.meow() 
    } 
} 
+0

@stumped:這是做你想做的更正確的方式。 – ankurtr 2013-02-25 03:45:19