2014-09-05 44 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