10

我有以下代码:

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 编译器抱怨此代码。它写道,该类IServiceAnnouncer是公共的,应在名为“IServiceAnnouncer.java”的文件中声明。

我对此有几个问题:

  1. 为什么编译器会说这IServiceAnnouncer是一个类?是一个界面。或者接口是一个类的部分案例?

  2. 如果我将接口IServiceAnnouncer放在一个名为“IServiceAnnouncer.java”的单独文件中(正如编译器所希望的那样),那么我如何从“HelloWorld.java”中使用它?

  3. 是什么public interface意思?公共接口和非公共接口有什么区别?

4

6 回答 6

17

你应该把它放在一个单独的文件中。这样,在不知道您的实现细节或不得不拖入相关依赖项的情况下,更容易交换不同的实现,或者使接口(系统的 API)可供其他人编写代码。

例如,常见 Java API 的实现——例如 servlet——将有一个针对 Sun 提供的接口包进行编码的实现(在这种情况下javax.servlet

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

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

于 2010-03-05T21:19:24.890 回答
8

这些答案围绕着正确的答案跳舞。

  1. 是的,您可以在 Java 的一个文件中声明多个类。
  2. 您不能声明多个公共类,因为:
  3. 公共类的名称必须与其包含的文件名匹配;这是你的编译错误

在 Java 中,在一个文件中声明多个类是非常奇怪的,尽管您可以这样做。不要这样做。

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

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

于 2010-03-05T21:41:33.940 回答
6

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

于 2010-03-05T21:19:11.907 回答
2

编译器使用术语“类”有点松散。更通用的术语可能是“类型”。我猜编译器使用术语“类”,因为它从每个类型声明(、、和)中生成相同格式的“.class classinterface文件enum

接口不一定是public. 如果声明它没有访问修饰符,则只能在其“包”内访问它。

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

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

于 2010-03-05T21:25:14.717 回答
0
  1. 一个文件中有多个类定义的问题是以下错误,在使用版本控制并且多个开发人员在同一个项目上工作时可能会出现以下错误:

    duplicate class: X
    class X {
    

    因此,最好将公共(以及非公共,顺便说一句)类放在单独的文件中。这将减少出现这些错误的机会。

  2. 如果它在同一个文件夹中,只需使用IServiceAnnouncer,如果它在不同文件夹中,则使用import它。

  3. public从所有包装中都可以看到。不public意味着一种protected(虽然关键字protected被禁止,但很奇怪吧!):它只能在同一个包中可见。如果您不确定包是什么,请查看 Java 教程。http://java.sun.com/docs/books/tutorial/java/package/packages.html

于 2010-03-05T21:22:42.673 回答
-1

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

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

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

于 2010-03-05T21:24:23.470 回答