2011-06-10 67 views

回答

37

Yes,它會的。爲什麼不呢?

因爲孩子實際上是父母的一個實例。如果你只想爲孩子進行操作,你應該檢查

if (child instanceof Child){ 
} 

然而,你應該從有效的C記住下面的語句++,斯科特邁爾斯:

「任何時候你發現自己寫 形式的代碼「如果對象是 T1類型的,然後做一些事情,但如果 它的類型T2的,然後做一些別的 ,」拍自己。

我認爲這也適用於這種情況。如果你想doSomething根據被引用的對象屬於什麼類型,下面的代碼結構應該幫助你。

注意:我還沒有編譯它。

class Parent { 
    public void doSomething() { 
     System.out.println("I am the Parent, and I do as I like"); 
    } 
} 

class ChildA extends Parent { 
    public void doSomething() { 
     System.out.println("I am a child named A, but I have my own ways, different from Parent"); 
    } 
} 

class ChildB extends Parent { 
    public void doSomething() { 
     System.out.println("I am a child named B, but I have my own ways, different from my Parent and my siblings"); 
    } 
} 

public class Polymorphism101 { 

    public static void main() { 

     Parent p = new Parent(); 
     p.doSomething(); 

     p = new ChildA(); 
     p.doSomething(); 

     p = new ChildB(); 
     p.doSomething(); 

    } 

} 
+0

但我確定運行時的對象類型,我需要定義一個父引用來保存所有類型的子對象。我怎麼能以其他方式做到這一點? – ikbal 2011-06-10 09:12:54

+0

@ user479129:您可以在父類型的引用中持有父代的任何子代的引用。也就是說,如果有一個'Parent Parent {}'類和'ChildA extends Parent'和'ChildB extends Parent',那麼您可以使用'Parent p'來引用'ChildA'或'ChildB'類型的對象,但是我別相信你的意思。 – 2011-06-10 09:48:24

+0

我需要控制該對象p是它的子類型,而不是父類型。在某些情況下,它可能是父類型,所以我需要檢查它是否正是我想要的類型。那是我想要的。我希望它清楚 – ikbal 2011-06-10 11:36:38

0

ofcourse,因爲孩子是家長

0

的實例返回true。每當參考(instanceof表達式的左側)可以投射到ReferenceTypeinstanceof表達式的右側的類型)時,instanceof將爲真。這將是真正的子類在關係到他們的父母:

Child child = new Child(); 
Parent parent = (Parent) child; //works! 
assert child instanceof Parent; //true 

The Java Language Specification, Java SE 9 Edition

15.20. Relational Operators
...
RelationalExpression的instanceof 引用類型

15.20.2. Type Comparison Operator instanceof
...
在運行時,instanceof操作的結果是true如果RelationalExpression的值不null和參考可強制轉換爲引用類型沒有養ClassCastException。否則結果是false