2014-09-05 16 views
1

我想明白這一點:多態性在Java解析的父類和子類對象

ParentClass p=new ChildClass(); 
//Here ChildClass extends ParentClass 

ParentClassChildClassp對象?

+3

P是ChildClass對象。 – Ajit 2014-09-05 14:21:32

+0

這就是所謂的多態性(http://en.wikipedia.org/wiki/Polymorphism_(computer_science)) – 2014-09-05 14:23:20

+0

@ArnaldoIgnacioGasparVéjar這被稱爲繼承,而不是多態性 – 2014-09-05 14:26:06

回答

4

是ParentClass還是ChildClass的p對象?

pChildClass的實例。 ChildClass的任何實例也是ParentClass的一個實例。反過來是不正確的。

編輯:

如果你打電話給p.getClass(),將返回ChildClass

+0

'ParentClass p = new ChildClass();' and 'ChildClass p = new ChildClass();' – 2014-09-05 14:23:51

+1

@MS有什麼區別?如果你聲明類型爲'ChildClass',那麼你將有權訪問'ChildClass'的成員在'ParentClass'中不可用。 – adv12 2014-09-05 14:27:05

+2

只要在堆上分配什麼對象就沒有區別。在這兩種情況下都會創建具有相同行爲和屬性的相同對象。區別在於您可以對參考進行的操作。例如,如果一個方法接受一個類型爲「ParentClass」的參數,你可以將一個類型爲「ParentClass」或者「ChildClass」的引用傳遞給該方法。如果該方法接受一個類型爲「ChildClass」的參數,則不能將該類型爲「ParentClass」的引用傳遞給該方法。同樣,如果你在'ChildClass'中定義一個方法,你不能在'ParnetClass'引用上調用該方法。 – 2014-09-05 14:27:07

0

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 
} 

}

-2

P是指向childClass實例在堆型父類的堆疊的參考,這樣可以只是調用在父類中定義類成員和上取多態性的優點通過方法覆蓋運行時。

+0

爲什麼downvote? – Genjuro 2014-09-05 14:46:16

1

想想p作爲給定對象的視圖。您可以將Dog視爲Animal(在這種情況下,您可以例如feed()它),或者您可以將其視爲Dog(因此您可以將其視爲bark())。換句話說,引用對象的變量的類型將限制您可以調用的對象,但不會更改對象的類型。

+0

'ParentClass p = new ChildClass();'和'ChildClass p = new ChildClass();' – 2014-09-05 14:26:58

+0

區別在於你可以調用'p'。在第一種情況下,如果您嘗試調用僅存在於「ChildClass」上的方法,則編譯器將失敗,而在第二種情況下則不會。 – sfThomas 2014-09-05 14:28:23

-1

p根本不是實例。它只是指向堆內存上的ChildClass對象的類型ParentClass的引用。

Objects住在堆上,而引用可以在堆棧內存或堆中的其他對象上。認爲reference作爲指針在c/c + +與一些額外的功能。

你的例子是繼承類型ParentClass的引用可以指向ChildClass對象。

+0

-1:通常,在Java中引用對象的所有變量都是「指針」... – Betlista 2014-09-05 14:30:21

+0

將它稱爲實例也是正確的,因爲我們知道它是對堆中對象的引用。 – Genjuro 2014-09-05 14:31:36

+0

@Betlista - 不理解你的評論。什麼是'共同'?引用不只是指針。他們不止是那個 – Adi 2014-09-05 14:32:01