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

Logical Purpose or Usefulness for assigning a sub class object to super class reference

本问题已经有最佳答案,请猛点这里访问。
1
2
Parent parent = new Child();
parent.someMethod();

在什么情况下,像上面这样的协助是有用的,或者背后的逻辑解释是什么?而不是以下内容:

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

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

我能想到的唯一原因,取决于我做的一些琐事,是它让你知道,如果在写"parent.somemethod()"时"somemethod()"不在父级中,那么它在父级中是不可用的!

你能告诉我它是如何有用/必要的,并给我一些与面向对象概念相关的观点吗?我知道它与多态性有关,但我不认为有必要使用这种表示。

我们非常欣赏实际的实例。谢谢。

我查了下面的问题,但我觉得我没有我要找的答案。使用超类初始化子类对象Java


它使您有机会对不同的对象采取相同的行为。

例如,Object类。Object有一个toString()方法。每个类扩展对象都有toString()方法。(每个类都隐式地扩展Object类。)

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

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

1
2
3
4
5
6
7
8
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类对象的方法。

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

因为这个方法接受了Object类对象,所以我们可以将它用于汽车、人和灯,因为它们都是从Object类扩展而来的。

新方法的用法。

1
2
3
4
5
6
7
Person john = new Person();
Car ferrari = new Car();
Lamp philips = new Lamp();  

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