【问题标题】:Java Inheritence Instantiation [duplicate]Java继承实例化[重复]
【发布时间】:2018-06-13 11:29:14
【问题描述】:

我最近一直在阅读一本关于 Java 设计模式的书,并且遇到了从其他类继承并通过 put 实例化的类

Superclass s = new Subclass()

相对

Subclass s = new Subclass()

我最初的想法是,它更多是从设计的角度来看,并且是由于抽象或信息隐藏。但是,我仍然不确定,也无法找到明确的解释。

为什么有人会使用Superclass s = new Subclass() 进行实例化,使用Subclass s = new Subclass() 是否可以接受?

如果有人能帮助我了解这一点,我将不胜感激。

【问题讨论】:

  • 格式化你的问题和代码!
  • 是否可以使用Scanner sc = new Scanner(System.in); 代替Object sc = new Scanner(System.in);?是的。你为什么还要问?
  • @JohannesKuhn 虽然这是可以接受的,但 OP 会问你为什么要使用这样的东西,因为它看起来很混乱。 Ben 给出的答案以及上面由 khelwood 链接的问题中的前两个答案都回答了该问题。

标签: java class object inheritance


【解决方案1】:

想象一个带有子类DogCat 的类Animal。您现在想要创建一个动物管理系统。为简单起见,您希望将所有动物都放在一个列表中。你现在可以写:

List<Animal> managementList = new ArrayList<>();

并在其中添加Dogs 和Cats,就像这样:

managementList.add(new Dog());
managementList.add(new Cat());

这很容易维护,因为 Dogs 和 Cats 都是 Animals。

当您现在从列表中检索动物时,您可以执行以下操作:

Animal theFirstAnimal = managementList.get(0);

作为一个聪明的经理,你知道第一个动物是Dog。所以你也可以写:

Dog theFirstAnimal = (Dog) managementList.get(0);

如果您不再确定第一只动物是否是狗,但您真的想对它做一些事情,只有当它是狗时,您可以使用instanceof 来检查它是否真的是狗。

if(managementList.get(0) instanceof Dog)
{
    doSomething();
} 

并且回答你的最后一个问题是否可以简单地实例化子类:当然可以。如果你不喜欢猫,只想和狗一起工作,没有人会阻止你做:

List<Dog> dogManagementList = new ArrayList<>();

【讨论】:

  • 所有这些魔法都被称为多态性
  • List&lt;Animal&gt; managementList = new ArrayList&lt;&gt;(); 本身也是一个很好的例子。如果您每个人都决定将 ArrayList 更改为 List 的另一个实现(如果您当然没有使用任何 ArrayList 特定的方法调用),您只需要更改这些实例。如果它是ArrayList&lt;Animal&gt; managementList = new ArrayList&lt;&gt;();,那么您必须在不止一个地方进行更改。
  • @KevinCruijssen 是的,这确实是一个非常有用的机制的实际示例。现在决定使用LinkedList?您只需要更改一行代码,因为LinkedListArrayList 都是List。甚至没有注意到这个小部分:)
  • 非常感谢您的回复,帮助很大。所以你能说这是抽象吗?您只需要知道动物的关键细节,因此子类中的任何额外内容都与手头的任务无关?
  • 在这个例子中Animal是一个抽象,是的。
【解决方案2】:

说到Upcasting,在函数参数的形式上也是有帮助的:

public class Music {
 public static void tune(Instrument i) {
     // ...
     i.play(Note.MIDDLE_C);
 }
 public static void main(String[] args) {
    Wind flute = new Wind();  //Wind extends Instrument
    tune(flute); // Upcasting
 }
}

Music.tune( ) 方法接受一个 Instrument 引用,但也接受从 Instrument 派生的任何东西。

从 Wind 向上转换到 Instrument 可能会“缩小”该接口,但它不能使它比 Instrument 的完整接口少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多