【问题标题】:interface and overriding the methods of the interface接口和覆盖接口的方法
【发布时间】:2013-11-14 12:01:28
【问题描述】:

我今年 13 岁,对 Java 很陌生。我似乎无法弄清楚如何不从接口实现类中的重写方法,因为它们是引用。我不想制作新副本,也不能只制作(在此处插入类)扩展(接口从中获取一些方法的类)。所以我实现了它,我得到了什么?

err: The type Threadmanager must implement the inherited abstract method (the method)

然后它有一个列表,其中一个说“实现未继承的方法”。

但我不想实现任何方法!我想使用它们!

Threadmanager tm;
AwtUtils manager = tm;
manager.drawImage(/*params*/)

上面是我想要的,下面是我不要的:

@override
public void drawImage(/*params*/){
...
}

我不想重新定义接口中的方法,只需使用它们即可。而且我不能让 ThreadManager 类扩展 Debugger(.java) 因为它已经扩展了一些东西。我认为接口是一种您可以在另一个类中使用这些方法而无需通过“class foo extends bar”继承它们的方式

顺便说一句,接口中引用的所有方法都是对我的类 Debugger.java 中的方法的引用,它兼作调试器和游戏库。

【问题讨论】:

  • 你将如何使用尚未在任何地方实现的方法?
  • 事实是:你必须从接口实现方法。
  • 我很难理解你的问题。能否提供更多示例代码?

标签: java interface overriding


【解决方案1】:

您不能使用接口中的方法。接口没有代码,只有定义。将其视为实现它的类必须履行的功能契约

例如

public interface Example {
    public void method1ToImplement();
    public int method2ToImplement(final String input);
}

这是所有实现此接口的类都必须履行的契约。这意味着implements Example 必须实现public void method1ToImplement()public int method2ToImplement(String) 的任何可实例化类。这是因为您在声明此类实现此功能,因此您必须实现此功能,因为到目前为止,您的类中没有此功能的代码,因为接口不包含代码。例如,你不能使用List 中的方法,实际上你甚至不能创建一个新的List,因为它是一个接口。但是您可以创建和ArrayList 并使用它的方法,因为它是实现List 接口的非抽象类。

也许您感到困惑,因为您在其他地方看到了可以使用已经实现的方法,例如toString()(已经在所有类中实现)。这是因为此方法不是在接口中定义的,而是由父类定义的(在toString() 的情况下,它是实现它的对象)。

TL;DR:实现接口的类必须实现其方法,除非它是抽象的。

【讨论】:

  • 我认为接口可以保存对其他类可以实现以使用这些方法的其他方法的引用,而不会成为接口中具有引用方法的类的子类!
  • 接口不包含对任何东西的引用。那样是行不通的:你怎么知道这些方法的实现是什么,如果那是你想要使用的?如何更改“引用”方法?这是类(接口实现)的用途,而不是接口。
【解决方案2】:

如果我的理解是正确的,您希望一个类实现一个接口,但不要实现它的方法。如果是这样,你不能。接口方法的实现是强制性的,除非您正在编写一个抽象类

我猜您的问题中缺少某些内容,所以请提供您的InterfaceClass 的一些代码,以便我们为您提供更好的答案。

【讨论】:

  • 好吧,我有一个接口,我只想使用引用的方法。实现方法是否不可避免,并且必须使用@override对方法进行自己的定义?
  • @LinkTheProgrammer 看看我的回答,这可能有助于澄清事情。
  • 是的,实际上正如其他用户所说,接口方法根本没有定义。如果没有在类中实现它们就不能使用它们,因为它们不“存在”,只有它们的方法签名。
【解决方案3】:

我认为您对接口的作用感到困惑。接口简单地定义了一个契约,任何实现该接口的对象都必须定义接口中的方法。如果你有一个抽象类,那么你必须为任何扩展抽象类的类实现该类的抽象方法。唯一的例外是当您 extend 来自已经实现抽象方法或接口的类并且您不想/不需要为子类重新定义它们时。

你说你不想实现方法,你只想使用它们,但是你不能使用不存在的方法。实现一个接口并不会神奇地定义接口方法中的逻辑——那是你的工作。同样,它只是声明任何实现接口的对象都将定义接口的方法。

接口的优点之一如下:假设我们有一个对象集合,它们都实现了一个特定的接口,然后我们可以从所有这些对象的接口调用任何方法。注意:我们可以通过数组、ArrayList 或你有什么将接口作为类型参数的方法将所述对象组合在一起,即ArrayList<MyInterface>

更具体的例子:
让我们考虑一个 Shape 接口,它只包含一个 area 方法的标题。我们可以有一堆不同类型的形状来实现 Shape 接口(圆形、正方形等)。在每个形状类中,我们定义了一个方法来获取所述形状的区域。现在,如果我们有一个ArrayList<Shape> shapes =...,我们可以将不同类型的形状放入该列表并执行以下操作:

for (Shape s : shapes)
{
     System.out.println(s.area());
}

【讨论】:

  • 哦,好吧,我现在明白了,但是 threadmanager 不是包中任何东西的子类,它是其他东西的子类。并且界面中的对象不应该是抽象的,因为我的游戏中没有抽象类
  • @LinkTheProgrammer 我只是给出一个一般的、全面的解释。尽管如此,希望现在情况更清楚了。
  • 谢谢,但是如果我不能使用接口,我有什么替代方法可以在类本身中编写方法?我有一个兼作调试器和库的库,它包含很多方法。我拥有的类不是我的库的子类,因为它是一个线程管理器(因此得名)
  • 抽象类不是没有的东西。如果需要,您应该有抽象类。
  • 如果你想要在另一个类中使用方法而不传递对该对象的引用,你可以寻找静态方法或单例模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多