Java 我应该把一个公共接口放在一个单独的文件中吗?

Java 我应该把一个公共接口放在一个单独的文件中吗?,java,interface,public,Java,Interface,Public,我有以下代码: import com.apple.dnssd.*; public interface IServiceAnnouncer { public void registerService(); public void unregisterService(); public boolean isRegistered(); } class HelloWorld { public static void main(String[] args) {

我有以下代码:

import com.apple.dnssd.*;

public interface IServiceAnnouncer {
    public void registerService();
    public void unregisterService();
    public boolean isRegistered();
}

class HelloWorld {
        public static void main(String[] args) {
                System.out.println("Hello, World!");
        }
}
此代码保存在名为“HelloWorld.java”的文件中。Java编译器抱怨这段代码。它写到类
iserviceanonuer
是公共的,应该在名为“iserviceanonuer.java”的文件中声明

关于这一点,我有几个问题:

  • 为什么编译器会说
    iserviceanonnouncer
    是一个类?这是一个界面。或者接口是一个类的局部情况

  • 如果我将接口
    iserviceanonuer
    放在一个名为“iserviceanonuer.java”的单独文件中(根据编译器的需要),那么如何从“HelloWorld.java”使用它呢

  • 公共界面
    是什么意思?公共接口和非公共接口的区别是什么


  • 你别无选择。所有公共类/接口必须位于名为ClassOrInterfaceName.java的文件中。

    您应该将其放在单独的文件中。这样就更容易在不同的实现中进行交换,或者让其他人可以使用接口(系统的API)进行编码,而不必知道您的实现的细节,也不必拖入相关的依赖项

    e、 g.通用Java API的实现(例如servlet)将根据Sun提供的接口包编码实现(在本例中为
    javax.servlet

    如何从实现中使用它?通过导入它。如果它在同一个包中,并且您同时编译所有接口/实现,那么这是不必要的

    请注意,接口以与实现相同的方式编译成.class文件(使用
    class
    定义)

  • 一个文件中有多个类定义的问题是以下错误,当使用版本控制且多个开发人员在同一项目上工作时,可能会发生此错误:

    duplicate class: X
    class X {
    
    因此,最好将public(以及非public,顺便说一句)类放在单独的文件中。这将减少发生这些错误的机会

  • 如果它在同一个文件夹中,只需使用
    IServiceAnouncer
    ,如果它在不同的文件夹中,则使用
    import
    it

  • public
    在所有软件包中都可见。No
    public
    表示一种
    protected
    (而关键字
    protected
    是禁止的,奇怪吧!):它只能从同一个包中看到。如果您不确定包是什么,请查看Java教程

  • 1) 编译器只是抱怨您定义了两个公共顶级类型。在Java中不能这样做。如果愿意,可以将接口嵌套在类中,或者将其设置为非公共(默认可见性),但这在Java中并不常见,在这里可能也不太有用

    2) 您要么需要实现接口,要么需要访问实现接口的对象


    3) 接口可以是公共的,也可以是默认的(包)可见性。接口中的方法不需要公共修饰符,因为默认情况下它们是公共的。

    编译器使用的术语“类”有点松散。更一般的术语可能是“类型”。我猜编译器之所以使用术语“类”,是因为它从每个类型声明(
    class
    接口
    、和
    枚举
    )生成格式相同的“.class”文件

    界面不必是
    公共的
    。如果声明它时没有访问修饰符,则只能在其“包”中访问它

    Java类型可以(应该)在包中声明。包是应该一起构建和部署的Java类型的集合。默认情况下,包中的所有类型都是隐式导入的,因此如果您的接口在同一个包中,则它将可用于
    HelloWorld


    如果不声明包,则默认包中会有一个类型。因此,即使您只是将
    IServiceAnnouncer
    接口放在一个单独的文件中,它也可以用于
    HelloWorld
    。只需同时编译这两个文件。

    这些答案围绕正确的答案

  • 是的,您可以在Java中的一个文件中声明多个类
  • 不能声明多个公共类,因为:
  • 公共类的名称必须与其包含的文件名匹配;这是您的编译错误
  • 在Java中,在一个文件中声明多个类是非常奇怪的,即使可以。不要这样做

    您将IServiceAnouncer放在一个单独的文件中,并将类名导入HelloWorld.java中。您只需同时编译它们,将这两个文件名传递给javac。这一切都有效


    公共接口,就像Java中的任何其他公共接口一样,是一种可以从任何其他类中看到和使用的类型。如果没有“public”,它的可见性称为包私有,这意味着只有同一个包中的东西才能使用它。

    接口不必是公共的。它们可以在包中使用,甚至可以在类中使用(我已经为状态模式做了这项工作)。这真的很有帮助。我也有同样的问题。3) 不正确:并非所有顶级(非嵌套)接口都是公共的。它们只有在定义为公共时才是公共的。试试看!是的,我应该提到包可见性!您可以在Java中定义任意多个顶级类,只是公共类必须与文件名匹配,这意味着您只能在一个文件中声明一个顶级公共类型。这与您的问题无关,但根据标准Java编码标准,您应该在接口前加上“I”。@Steve Kuo:好建议,但你可能有一个词::-)