【问题标题】:Importing Interfaces in Java [duplicate]在 Java 中导入接口 [重复]
【发布时间】:2017-06-27 19:41:08
【问题描述】:

我正在从事一个包含以下界面的项目

import ListIF;

public interface PlayListIF {

    public ListIF<Integer> getPlayList();

    public void addListOfTunes(ListIF<Integer> lT);

    public void removeTune(int tuneID);

}

稍后,其他类使用

import PlayListIF 
import PlayList

然后创建一个实例:

PlayListIF playlist = new PlayList();

导入接口或其实现之间有什么区别吗?导入接口有什么意义?

谢谢

【问题讨论】:

  • 我很困惑。您是在问 import 声明的作用还是在问为什么允许您写 PlayListIF playlist = new PlayList();
  • import 语句只允许您引用接口而不用包完全限定其名称。您正在使用未命名的包,因此无论如何您都不必对其进行限定。但是,请注意有issues associated with using the default package
  • 您曾经引用​​过的任何类型,接口、类或枚举,通常都需要导入(除非您在任何地方明确限定它或它位于同一个包中)。
  • Java 基础知识,任何教程都会有所帮助

标签: java interface


【解决方案1】:

导入一个实现(PlayList)和接口的重点是因为这行代码,

PlayListIF playlist = new PlayList();

引用实现的实例和接口。变量playlist 可以是实现PlayListIF 的类的任何实例。它恰好是PlayList 类的实例,而它可能是实现PlayListIF 接口的任何类的实例。

【讨论】:

  • 您无法导入实例。但是,您可以导入一个类。另请注意,该变量不是实例——它是对实例的引用。
  • 好的,谢谢。我说话很懒惰,这在技术上是不正确的。我在适当的地方用实现替换了实例这个词。
  • 此外,导入的实际意义在于不必完全限定类和接口名称。
【解决方案2】:

您在代码中引用的任何类/接口都需要导入,以便编译器知道您所指的是什么。 在这种情况下,您指的是两者,因此您需要同时导入两者。

【讨论】:

  • 不正确。如果您使用它们的完全限定名称,则可以在不导入的情况下引用类/接口,或者导入它们的整个包。
【解决方案3】:

我可以尝试通过给一个java新手的小例子来解释。 拥有一个具有方法 save(something) 的类。 您可能想保存“某物”

  1. 您的硬盘
  2. 一个 FTP
  3. 通过网络服务
  4. 等等……

基本上你会写一个服务(接口)

public interface Saver{    
    public void save(MyData something);
}

你会有这样的任何实现

  • FTPSaver
  • 硬盘保护程序
  • 等等……

现在,当您实际使用 Saver 时,可以说

public class A {
    private Saver saver;
    public A (Saver saver){
        this.saver = saver;}
}

您可以通过构造函数 FTPSaver 或 HardDriveSaver 进行注入,具体取决于您希望它在特定上下文中保存的方式,但对于 A 类,它使用的是 Saver,无论哪个都没有关系。

TLDR:接口是一个契约,它显示可用的方法,而不管它们的实现,如果你实现一个接口,你必须实现其中的所有方法。你应该使用接口作为属性而不是实现。

希望对你有帮助

【讨论】:

  • 这和用户提出的importing问题有什么关系?
  • 用户的问题让我质疑自己对界面的了解。它没有具体回答“导入”问题。通过更深入地解释它,我虽然他自己会理解他可以只导入接口。并注入一个实现。如果我不够清楚,我很抱歉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2011-01-03
  • 2018-01-16
  • 2012-11-27
相关资源
最近更新 更多