当前位置: 首页 > 知识库问答 >
问题:

为什么不重写而不是使用抽象类呢?

连文栋
2023-03-14

对许多人来说,这可能是一个简单的问题,但让我困惑。我从凯西·塞拉那里挑选了一个例子,展示了抽象类的实用性,但我无法理解抽象类的整体重要性。

例如,我们有一个带有抽象方法的抽象类Carpower()

我的问题是——为什么我们首先需要抽象类Car来为每种汽车类型定制方法?为什么不在这些汽车子类型中的任何一个中使用这两种方法,比如宝马和其他两个——大众和奥迪——可以简单地覆盖这些方法?

共有3个答案

步胜
2023-03-14

因此,您可以编写代码来处理汽车s,而不知道它是什么类型的汽车:

public void PrintTopSpeed(Car car)
{
    System.out.println("This car's top speed is " + car.topSpeed());
}

如果Car类没有定义topSuper(),这段代码将无法编译。您必须为宝马、大众、奥迪等派生类提供不同版本的打印函数。这可能是面向对象编程中最基本的概念,所以您真的需要掌握它。基类允许对象共享公共行为,并允许编写代码来使用该行为,而不知道它处理的对象的特定类型。

勾渝
2023-03-14

为什么不将这两种方法应用于这些汽车子类型中的任何一种,比如宝马和其他两种——大众和奥迪——可以简单地覆盖这些方法?

这难道不需要大众和奥迪继承宝马吗?那是不对的,因为那不是宝马。

抽象基类及其抽象方法形成了一种契约,继承对象必须实现这种契约。没有比这更具体的车了。但所有具体类型都有共同点。抽象的Car强制执行这些共性,允许在需要时将特定类型视为Car的通用实例。

例如,如果您的代码需要一辆汽车,它将在上面调用Drive()方法,那么该代码并不关心它得到的是哪种汽车。它将Drive()anyCar。所以它接受一个抽象类型,所以实现该类型的任何东西都可以使用:

UseACar(Car car)
{
    car.Drive();
}

// elsewhere

BMW myCar = new BMW();
UseACar(myCar);

没有这种契约的执行,静态类型和编译语言将无法保证。对象上存在Drive()。你需要为每种可能的汽车创建一个UseAX()方法,每种汽车都可以接受不同的类型。使用这样的多态性可以创建一个更通用的方法,该方法适用于抽象类型的任何实例。

微生智刚
2023-03-14

通过使方法抽象化,这意味着人们必须实现它。你要求人们这样做,人们不可能忘记这样做,因为如果他们这样做,它将无法编译。

@overide注释存在的原因非常相似,通过将方法标记为@overide,如果(例如)您键入了错误的方法名称,并且实际上没有覆盖某些内容,则会出现错误。

在许多方面,抽象类介于接口和普通类之间——它定义了您需要做什么才能像接口一样使用它,但它也为您处理一些实现。

类只能扩展另一个类。它们可以实现任意数量的接口。

例如,您可能拥有由汽车摩托车火车继承的机动车辆,但您可能拥有由汽车摩托车脚踏板实现的可操控界面。

要回答评论中的问题:

如果有一个接口“I”具有由类“A”实现的方法m(),而另一个类“B”想要访问方法m(),那么这里对接口的需求是什么。我们能不能干脆不在A类中实现这个方法?

你可以——但另一方面,如果类B想要在类a和类C中访问方法m()(其中a和C不相互继承,或者不从包含m()的公共类继承),那么实现方法是指定一个公共接口I,而类B使用接口类型I,完全不是A型和C型。

还要记住,接口可以在包和库之间使用。例如,侦听器和策略模式大量使用接口。当Java开发人员编写JButton时(例如),ActionLstener被指定为一个接口,为将来使用JButton的人提供最大的灵活性。

 类似资料:
  • 问题内容: 对于许多人来说,这可能是一个简单的问题,但令我感到困惑。我从Kathy Sierra挑选了一个示例,该示例显示了抽象类的效用,但我无法理解抽象类的总体重要性。 示例 我们有一个带有抽象方法- &的抽象类。这些方法在 BMW , Volkswagen 和 Audi的 子类中实现。 我的问题是- 为什么我们首先需要有抽象类来为每种汽车类型自定义方法?为什么在宝马的任何一种子类型中都没有这两

  • 问题内容: 为什么将类实现为常规类而不是将 抽象方法实现为 抽象 类。 会不会带来任何问题?或以这种方式有什么用吗? 而且,该方法应该是一种非常特定的方法, 其功能不能由任何其他类实现 (如果我没记错的话)。因此,我想该关键字比其他任何方法都更适合此操作。 但是我可以重写此方法并根据需要使用它, 它显然只印了, 有人告诉你我会产生一个新线程吗? 除了使工程师取代您感到困惑之外,还有什么其他用途?

  • 问题内容: 我想知道何时应该使用接口。 让我们考虑以下内容: 和: 我可以轻松实现它们,它们具有相同的功能…但是我也可以向车辆类中添加一些变量,这些变量可能应该在车辆中使用(maxSpeed,carType …) 使用接口的原因是什么? 谢谢! 编辑: 我在另一个线程中找到了关于它的漂亮链接:http : //www.thecoldsun.com/en/content/01-2009/abstra

  • 为什么我从下面的代码中得到这个编译错误消息? (程序根据键盘上按下的箭头键,在4个方向上移动箭头:d) Direction.java:41:错误:DirectionBoard。DirectionListener不是抽象的,并且不会覆盖KeyListener中的抽象方法keyReleated(KeyEvent)

  • 问题内容: 为什么Object类是Java中em的基类,而不是抽象类? 我已经有很长时间了,这个问题纯粹是出于好奇,仅此而已。我的代码或任何人的代码都没有中断,因为它不是抽象的,但是我想知道为什么他们将其具体化了? 为什么有人要这个Object类的“实例”(而不是引用的存在)?一种情况是糟糕的同步代码,该代码使用对象的实例进行锁定(至少我曾经以这种方式使用过一次……我的错)。 对象类的“实例”是否

  • 如何解决此错误,我不想删除。请任何人在不删除`implements actionlistener的情况下更正此错误。