Java 返回接口类型的对象的方法

Java 返回接口类型的对象的方法,java,object,interface,Java,Object,Interface,所有像我这样的初学者,看到方法返回接口类型的对象总是会感到困惑,因为接口有抽象方法,因此无法实例化 我终于想出了一个办法来理解这一点: ((当我们说一个方法返回一个接口类型的对象时,我们实际上隐含地说该方法实际上返回了实现该接口的某个类的对象/实例,但在大多数情况下,该类是未知的,因为它在方法的实现中被声明为匿名的。因此,我们指的是返回的对象属于该接口类型。)) 这个解释正确吗?月底是我的生日,所以我给我所有的朋友和家人添加了一个新方法: public Present givePresent{

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

我终于想出了一个办法来理解这一点:


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


这个解释正确吗?

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

public Present givePresent{
    //code to select an appropriate and sufficiently expensive present
    return present;
}
我可以在这里做两件事。我可以编写一个
Present
类,并确保所有可能的Present都能扩展它。但是我们可能会遇到各种各样的问题:
BatmanComic
已经继承了
ComicBook
,例如,因此我们必须在树上越走越远,直到
Present
完成基本上与
对象
无法区分。另一种方法是查看这里实际发生的情况。我希望收到符合特定类别的内容,简而言之,Java有两种方法。继承和接口。将
呈现
作为接口实现与将其创建为抽象超类,但避免了多重继承的所有问题。这样,我所要做的就是编写一个接口:

public interface Present{
}
确保所有的袜子和书籍以及任何实现它的东西。

“…当我们说一个方法返回一个接口类型的对象时,我们实际上是隐式地说该方法实际上返回一个实现该接口的某个类的对象/实例…”-这是正确的,但我们明确地说它

正如@Jon Skeet所指出的,您定义的第二部分非常不正确。在实现中应用匿名类是一个非常特殊的情况。通常,返回接口会给您更多的自由:

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

经验法则如下。如果具体类实现了一个接口,而返回具体类对象没有任何好处,例如,
ArrayList
,则返回一个接口-
列表
集合
。这将增强代码的可维护性,也就是说,将来代码将更容易更改。

为什么复杂?该方法返回至少实现接口方法的某个对象。“但在大多数情况下,该类是未知的,因为它在该方法的实现中声明为匿名”-不,在大多数情况下不是这样。有时是这样,但在我的经验中,与大多数情况相去甚远。(想想有多少方法返回一个
列表
或类似的内容。)这也不局限于接口——任何返回
InputStream
的方法都将返回对子类某个实例的引用,例如