我想明白這一點:多態性在Java解析的父類和子類對象
ParentClass p=new ChildClass();
//Here ChildClass extends ParentClass
是ParentClass
或ChildClass
p
對象?
我想明白這一點:多態性在Java解析的父類和子類對象
ParentClass p=new ChildClass();
//Here ChildClass extends ParentClass
是ParentClass
或ChildClass
p
對象?
是ParentClass還是ChildClass的p對象?
p
是ChildClass
的實例。 ChildClass
的任何實例也是ParentClass
的一個實例。反過來是不正確的。
編輯:
如果你打電話給p.getClass()
,將返回ChildClass
。
'ParentClass p = new ChildClass();' and 'ChildClass p = new ChildClass();' – 2014-09-05 14:23:51
@MS有什麼區別?如果你聲明類型爲'ChildClass',那麼你將有權訪問'ChildClass'的成員在'ParentClass'中不可用。 – adv12 2014-09-05 14:27:05
只要在堆上分配什麼對象就沒有區別。在這兩種情況下都會創建具有相同行爲和屬性的相同對象。區別在於您可以對參考進行的操作。例如,如果一個方法接受一個類型爲「ParentClass」的參數,你可以將一個類型爲「ParentClass」或者「ChildClass」的引用傳遞給該方法。如果該方法接受一個類型爲「ChildClass」的參數,則不能將該類型爲「ParentClass」的引用傳遞給該方法。同樣,如果你在'ChildClass'中定義一個方法,你不能在'ParnetClass'引用上調用該方法。 – 2014-09-05 14:27:07
p是哪一種類型的ParentClass
和 用對,你可以調用父類中的所有方法的一個實例ChildClass
但你不能叫ChildClass的任何方法。 實施例
public class ParentClass{
public Person(){}
public void p(){
System.out.println("from p()");
}
}
public class ChildClass extends ParentClass{
public void c(){
System.out.println("from c()");
}
public static void main(String[] args) {
ParentClass p = new ChildClass();
ChildClass c = new ChildClass();
p.p(); //possible
p.c(); //not possible
c.c(); //possible
}
}
P是指向childClass實例在堆型父類的堆疊的參考,這樣可以只是調用在父類中定義類成員和上取多態性的優點通過方法覆蓋運行時。
爲什麼downvote? – Genjuro 2014-09-05 14:46:16
想想p
作爲給定對象的視圖。您可以將Dog
視爲Animal
(在這種情況下,您可以例如feed()
它),或者您可以將其視爲Dog
(因此您可以將其視爲bark()
)。換句話說,引用對象的變量的類型將限制您可以調用的對象,但不會更改對象的類型。
'ParentClass p = new ChildClass();'和'ChildClass p = new ChildClass();' – 2014-09-05 14:26:58
區別在於你可以調用'p'。在第一種情況下,如果您嘗試調用僅存在於「ChildClass」上的方法,則編譯器將失敗,而在第二種情況下則不會。 – sfThomas 2014-09-05 14:28:23
p
根本不是實例。它只是指向堆內存上的ChildClass
對象的類型ParentClass
的引用。
Objects
住在堆上,而引用可以在堆棧內存或堆中的其他對象上。認爲reference
作爲指針在c/c + +與一些額外的功能。
你的例子是繼承類型ParentClass
的引用可以指向ChildClass
對象。
P是ChildClass對象。 – Ajit 2014-09-05 14:21:32
這就是所謂的多態性(http://en.wikipedia.org/wiki/Polymorphism_(computer_science)) – 2014-09-05 14:23:20
@ArnaldoIgnacioGasparVéjar這被稱爲繼承,而不是多態性 – 2014-09-05 14:26:06