当前位置: 首页 > 面试题库 >

多态与继承

蒲功
2023-03-14
问题内容

假设我有两个班级:动物和狗。狗是动物的子类。我执行以下代码:

Animal a = new Dog();

现在,我可以通过a变量来调用Dog类的方法。

但是我的问题是:如果我可以通过Dog对象(继承性)调用Animal的所有方法,那么为什么要使用多态原理呢?我可以声明:

Dog d = new Dog();

通过此声明,可以使用所有Animal方法和Dog方法。那么为什么要使用多态呢?非常感谢您的回答。


问题答案:

在Java中,多态和继承的概念被“焊接在一起”。通常,不必一定是这样:

  • 多态使您可以调用类的方法而无需知道类的确切类型
  • 继承使派生类共享其基类的接口和代码

在某些语言中,继承与多态性脱钩:

  • 在C ++中,您可以继承一个类而不产生多态行为(即,不要使用来标记基类中的函数virtual
  • 在Objective C中,您可以在不相关的类上实现一个方法,然后从仅知道该方法签名的地方调用它。

回到Java,使用多态的原因是将您的代码与实现其对手方的细节脱钩:例如,如果您可以编写一种Feed(Animal animal)适用于各种动物的方法,那么当您使用该方法时,该方法将仍然适用。添加的更多子类或实现Animal。这与将Feed(Dogdog)方法紧密结合到狗的方法相反。

至于

Dog d = new Dog();

声明是肯定的,如果您知道方法的其余部分专门针对狗,则没有一般的理由可以避免这种情况。但是,在许多情况下,情况并非如此:例如,您的类或方法通常对确切的实现不敏感,例如

List<Integer> numbers = new ArrayList<Integer>();

在这样的情况下,可以替换new ArrayList<Integer>()使用new LinkedList<Integer>(),并 知道
你的代码将编译。相反,如果您的numbers列表被声明为ArrayList<Integer> numbers,则这种转换可能不是确定的。



 类似资料:
  • 问题内容: 继承和多态都构成IS- A关系吗?在运行时发生继承和“重写”多态性而在编译时发生“过载”多态性是真的吗?我之所以这样问,是因为许多论坛似乎给出了相互矛盾且常常令人困惑的答案。 谢谢! 问题答案: 对于问题的第一部分,我认为维基百科提供了一个很好的定义: 在面向对象的程序设计中,子类型多态或包含多态是类型理论中的一个概念,其中名称可以表示许多不同类的实例,只要它们与某个公共超类相关即可。

  • 继承和多态 - 这是Python中一个非常重要的概念。 如果你想学习,你必须更好地理解它。 继承 (Inheritance) 面向对象编程的一个主要优点是重用。 继承是实现同样的机制之一。 继承允许程序员首先创建通用类或基类,然后将其扩展到更专业的类。 它允许程序员编写更好的代码。 使用继承,您可以使用或继承基类中可用的所有数据字段和方法。 稍后您可以添加自己的方法和数据字段,因此继承提供了一种组

  • 类的继承性是面向对象语言的基本特性,多态性的前提是继承性。Java支持继承性和多态性。本章讨论Java继承性和多态性。 12.1 Java中的继承 为了了解继承性,先看这样一个场景:一位面向对象的程序员小赵,在编程过程中需要描述和处理个人信息,于是定义了类Person,如下所示: //Person.java文件 package com.a51work6; import java.util.Dat

  • 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。 比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印: class Animal(object): def run(self):

  • 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。 比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印: class Animal(object): def run(self):

  • X:我有一个不相关的类似容器的对象(向量、映射、树、...)的集合,处理不同不相关类型的对象。这些容器中对象的生命周期在它们的某些子集之间共享。我有一个负责它们同步的对象。我能想到的同步类的最简单实现是有一个指针的向量,其中将是一个为我要管理的所有类似容器的对象实现公共接口的类。但并不是所有的都像容器一样。它们可以用作容器,但是让它们继承一个通用的基类感觉很奇怪,我害怕它会非常强烈地耦合我的设计。