【问题标题】:Logical Purpose or Usefulness for assigning a sub class object to super class reference [duplicate]将子类对象分配给超类引用的逻辑目的或用途[重复]
【发布时间】:2014-11-24 21:39:18
【问题描述】:
Parent parent = new Child();
parent.someMethod();

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

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

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

我能想出的唯一原因,取决于我所做的一些摆弄,它让你知道如果父级中不存在“someMethod()”,则它在父级中不可用,在写“parent.someMethod()”!

您能否阐明它的用途/必要性,并给我一些与面向对象概念相关的观点?我知道这与多态性有关。但我认为没有必要使用这种表示。

非常感谢实际的真实示例。谢谢。

我检查了以下 SO 问题,但我不觉得我有我正在寻找的答案。 Using superclass to initialise a subclass object java

【问题讨论】:

  • 这在几乎每本介绍性 Java 书籍中都有解释。答案确实是“多态性”。
  • 你能提供一个实际的例子吗 parent.someMethod();逻辑上比 child.someMethod();?
  • @user104309 - 当然 - 当父类有多个可能的子类时,现在和将来 - 并且您希望代码适用于所有子类。

标签: java inheritance polymorphism


【解决方案1】:

它让你有机会对不同的对象表现出相同的行为。

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

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

您想编写一个调用每个对象的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);

【讨论】:

  • 我能够了解您何时将父类的引用引出到方法中的参数并将多个子类的对象作为参数传递。它减少了方法调用,并且可以在所有其他可能的子类中重用相同的代码。但是当涉及到Person per=new Person(); Object obj=new Person(); 时,我无法理解per.toString()obj.toString()之间的区别
  • per.toString() 和 obj.toString() 调用相同的方法。
  • 我明白了。然后我可以选择 per.toString() 本身而不是 obj.toString() 对吗?我想我要么是在不必要地思考太深,要么我必须加强直觉。顺便说一句,在我之前的评论中,我的意思是“减少方法声明的数量”而不是“减少方法调用”。跨度>
  • 是的,你可以。正如我所说,当 obj 来自许多不同的子类并且您希望对所有子类都一样时,使用 obj.toString。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2014-09-08
相关资源
最近更新 更多