用于将子类对象分配给超类引用的逻辑用途或用途

时间:2014-11-24 21:39:18

标签: java inheritance polymorphism

Parent parent = new Child();
parent.someMethod();

在什么情况下,如上所述的分配是有用的,或者背后的逻辑解释是什么?而不是以下:

Child child = new Child();
child.someMethod();

在这两种情况下,无论如何都只会调用Child的方法。所以,为什么允许这种表示?这不是设计中允许的不必要功能吗?

我能想到的唯一原因,取决于我做的一些小事,它会让你知道" someMethod()"如果在父母中没有父母,则在父母中不可用,#34; parent.someMethod()"!

请您详细说明它是如何有用/必要的,并给我一些与面向对象概念相关的观点?我知道这与多态性有关。但我发现没有必要使用这种表示法。

非常感谢实际的现实世界的例子。感谢。

我检查以下问题,但我不觉得我有我想要的答案。 Using superclass to initialise a subclass object java

1 个答案:

答案 0 :(得分:2)

它为你提供了对不同物体表现相同的对手。

例如Object类。 ObjecttoString()方法。每个扩展Object的类都有toString()方法。 (每个班级都强调Object班级。)

现在,假设您有来自不同类的以下对象。一个人(人类),汽车(汽车类),灯(灯类)。

您想编写一个调用每个对象toString()方法的方法。您必须编写此方法的3个不同版本。

callToString(Person p) {p.toString();}  
// A method that accepts person objects.    

callToString(Car c){c.toString();}   
// A method that accepts car objecs.  

callToString(Lamp l){l.toString();}   
// A method that accepts lamp objects.

我们知道,每个3个类都来自Object类,Object类具有toString()方法。我们可以编写一个接受Object类对象的方法。

callToString(Object o){o.toString();}

现在这个方法接受Object类对象,我们可以将它与Car,Person和Lamp一起使用,因为它们都来自Object类。

使用新方法。

Person john = new Person();
Car ferrari = new Car();
Lamp philips = new Lamp();  

callToString(john);
callToString(ferrari);
callToString(philips);