返回接口类型对象的方法

时间:2017-10-01 16:19:00

标签: java object interface

所有像我一样的初学者总是会因为看到一个方法返回一个接口类型的对象而感到困惑,因为接口有抽象方法,因此无法实例化。

我终于找到了理解这个的方法:

((当我们说一个方法返回一个接口类型的对象时,我们实际上隐含地说该方法实际上返回了一个实现该接口的类的对象/实例,但在大多数情况下该类是未知的因为它在方法的实现中被声明为匿名。因此,我们将返回的对象称为该接口类型。))。

这个解释是否正确?

2 个答案:

答案 0 :(得分:1)

" ...当我们说一个方法返回一个接口类型的对象时,我们实际上隐式表示该方法实际上返回了某个类的对象/实例实现该接口..." - 这是正确的,但我们说明确

正如@Jon Skeet指出的那样,你的定义的第二部分是非常不正确的。在实现中应用匿名类是一个非常具体的案例。通常,返回界面会给你更多自由:

  • 可以更改方法的实现以返回实现相同接口的另一个对象,而不更改使用此方法的代码
  • 您可以将类扩展到覆盖方法,以便它返回另一个实现相同接口的对象。在这里,您实际上可以更改返回类型。如果基类的方法返回具体类,例如ArrayList,则重写方法也必须返回ArrayList或其子类。

经验法则如下。如果具体类实现了接口,并且返回具体类对象(例如ArrayList)没有任何好处,则返回接口 - ListCollection。这将增强代码的可维护性,即代码将来更容易更改。

答案 1 :(得分:0)

这是我这个月底的生日,所以我为所有朋友和家人添加了一种新方法:

public Present givePresent{
    //code to select an appropriate and sufficiently expensive present
    return present;
}

我可以在这做两件事。我可以写一个Present类,并确保所有可能的礼物都扩展它。但是我们可以在这里遇到各种各样的问题:例如,BatmanComic已经从ComicBook继承而来,所以我们必须进一步向上移动,直到Present为止基本上与Object无法区分。另一种方法是看看这里发生了什么。我希望收到符合特定类别的内容,简而言之,Java有两种方法可以做到这一点。继承和接口。创建Present作为接口实现与将其创建为抽象超类完全相同的目标,但避免了多重继承的所有问题。这样我所要做的就是编写一个接口:

public interface Present{
}

并确保所有袜子和书籍以及任何实施的内容。