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

Java 将子类对象分配给超类引用的逻辑目的或用途,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,在什么情况下,像上面这样的帮助是有用的,或者背后的逻辑解释是什么?而不是以下内容: Parent parent = new Child(); parent.someMethod(); 无论如何,在这两种情况下,只能调用Child的方法。那么,为什么允许这种表示呢?这不是设计中允许的不必要的特性吗 根据我所做的一些修改,我能想到的唯一原因是,在编写“Parent.someMethod()”时,它让您知道如果“someMethod()”在父级中不存在,那么“someMethod()”在父级中不可用

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

Parent parent = new Child();
parent.someMethod();
无论如何,在这两种情况下,只能调用Child的方法。那么,为什么允许这种表示呢?这不是设计中允许的不必要的特性吗

根据我所做的一些修改,我能想到的唯一原因是,在编写“Parent.someMethod()”时,它让您知道如果“someMethod()”在父级中不存在,那么“someMethod()”在父级中不可用

你能解释一下它是如何有用/必要的,并给我一些与面向对象概念相关的观点吗?我知道这与多态性有关,但我觉得没有必要使用这种表示法

非常欣赏实际例子。谢谢

我检查了下面的问题,但是我觉得我没有我想要的答案。

它使您有机会对不同的对象执行相同的操作

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

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

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

Child child = new Child();
child.someMethod();
我们知道每3个类都是从
Object
类扩展而来的,
Object
类有
toString()
方法。我们可以编写一个接受
Object
类对象的方法

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.
现在,由于该方法接受
Object
class对象,我们可以将其用于Car、Person和Lamp,因为它们都是从
Object
class扩展而来的

新方法的使用

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

基本上每一本Java入门书都对此进行了解释。答案确实是“多态性”。检查这个问题。你能提供一个实用的例子吗;逻辑上优于child.someMethod()@user104309-当然-当父类现在和将来都有多个可能的子类时-并且您希望代码能够为所有子类工作。我能够在您将父类对方法中参数的引用取出并将多个子类对象作为参数传递时获得透视图。它减少了方法调用,相同的代码可以跨所有其他可能的子类重用;Object obj=新的Person()我无法理解
per.toString()
obj.toString()
之间的区别,per.toString()和obj.toString()都调用相同的方法。我明白了。然后我可以选择
per.toString()
本身,而不是
obj.toString()
对吗?我想我要么是想想得太深入,要么就是我必须提高我的直觉。顺便说一句,在我之前的评论中,我的意思是“减少方法声明的数量”,而不是“减少方法调用”。是的,你可以。正如我所说,当obj来自许多不同的子类,并且您希望对所有子类都进行相同的处理时,将使用obj.toString。
Person john = new Person();
Car ferrari = new Car();
Lamp philips = new Lamp();  

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