扩展对象与实现接口

时间:2012-12-08 02:03:26

标签: java inheritance interface

试图理解我在测试中出错的问题:


继承与实现接口有何不同?

  1. 通过继承,一个类从其超类中获得行为。
  2. 使用接口,类从其实现的接口获得行为。 (这是我选择的那个)
  3. 对于继承,类必须实现其超类定义的方法。
  4. 使用接口,类可以从它实现的接口获得实例变量和行为。
  5. 我的想法是接口定义行为,而超类定义特征......或者它们是否相同?或者我完全倒退了吗?


    编辑:我想我应该指明我知道接口和继承之间的区别。我只是想知道使用术语行为的两个选项。我不知道教授是否在挑剔术语,或者他是否对这个问题提出质疑。

    我知道在实现接口时,必须实现接口中定义的所有方法。因此,我会说接口定义了一个类必须具有的行为,但扩展了另一个超类(虽然它也定义了一些行为(可以给予子类更多),但它没有' t似乎与界定行为的界面一样强烈。如果类实现了一个接口,你可以确定它有某些行为。

    也许这个问题的目的是询问界面本身是否有行为代码,或者它是否仅仅是定义 - 如果措辞如此,我会知道答案。

7 个答案:

答案 0 :(得分:2)

实现接口时,您不一定非常关心实现。还要记住,您可以根据需要实现任意数量的接口,因为它们只指定合同而不指定如何实现它们。界面的创建者可以让您处理它。

当您扩展Object时,通常是因为您需要一些已经存在的对象已经占据大部分功能的功能,但只需要额外的那些功能。或者您想要重新定义现有对象的一些现有行为。

给你答案:1是对的。您不必实现超类的方法(继承)。只有当它是抽象时,这个超类的下一个子类才需要实现这些方法(比如在接口中)。

答案 1 :(得分:2)

我认为你的一些误解可能纯粹源于语义。描述接口的一种更直接的方式可能是它定义了API,但没有提供该API的实现。需要注意的是,我将使用Java作为我的示例,但是在像C ++这样的语言中,实现接口特殊类型的继承 - 即从包含纯虚函数的类继承。

例如,在Java中,您可能将EventListener接口定义为:

public interface IEventListener {
    public void handleEvent(Event event);
}

接口不会,使用问题的措辞,说明实现IEventListener接口的类在接收事件时如何表现,它只能确保实现此接口的任何类都具有能够接收的特性事件类型的事件。

另一方面,继承允许超类也继承行为(实现)。例如,请考虑以下Java基类:

public abstract BaseClass {
    public void baseMethod(int value) {
        System.out.println(int);
}

public class SubClass extends BaseClass {
}

任何继承自BaseClass的类都会获得BaseClass的API(特征)以及实现(行为)。换句话说,不仅可以调用instanceOfSubClass.baseMethod(1)这样的特性,这样做会导致在BaseClass中定义的行为,即1被打印到控制台。

所以你的答案(2)是不正确的,因为接口不指定行为(实现)只有API(特征)。继承可以处理两者。

我认为问题的关键在于解释当您想要共享行为而不仅仅是API时,继承特别有用。也就是说,实现(行为)也可以通过组合来共享,这样的策略通常更好 - 请参阅Bloch的Effective Java中的第16项,以获得精彩的讨论。

答案 2 :(得分:0)

实现x接口的对象告诉对象它必须执行接口定义中列出的所有操作(方法)。因此,在实现x的对象中,您需要实现所有操作。接口无法实现。

但是当你从一个对象y继承时,对象y可能已经有了一些动作的实现。如果不是,该方法将被标记为抽象(在java中),您需要在继承的对象中实现它。

答案 3 :(得分:0)

这是Java中一个非常常见的面向对象设计问题。

真诚地推荐这篇非常好的文章来解释这个问题

http://www.javaworld.com/javaqa/2001-04/03-qa-0420-abstract.html

答案 4 :(得分:0)

正确答案是1.您选择的答案(选项2)是错误的,因为接口在技术上没有任何行为。它们只是一个抽象方法列表。您可以将它们视为可以基于类的模板。例如,假设项目分为两部分,需要在最后集成。每个团队都可以使用一个通用的界面来建立他们的类,这样整合就会轻松得多。

答案 5 :(得分:0)

继承,你得到一只猫。通过界面,您可以获得猫的骨架。

答案 6 :(得分:0)

您从继承获得行为和实现。请记住,子类从它的超类继承所有非构造函数和私有方法。这意味着您可以继承某些方法的功能(实现)。

通过实施,你获得了正当的行为。您正在执行的所有操作都是与编译器签订合同,并声明您承诺覆盖已实现的类或接口中定义的所有抽象方法。

我希望这会有所帮助。