我有以下代码:
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”的文件中声明。
我有几个问题:
为什么编译器会说IServiceAnnouncer
是一个类?这是一个界面。或者接口是类的部分情况?
如果我将接口IServiceAnnouncer
放在一个名为“IServiceAnnouncer.java”的单独文件中(正如编译器所希望的那样),我怎么能在“HelloWorld.java”中使用它?
public interface
是什么意思?公共界面和非公共界面有什么区别?
答案 0 :(得分:15)
您应该将其放在单独的文件中。这样就可以更容易地交换不同的实现,或者让其他人可以使用接口(系统的API)进行编码,而无需了解实现的细节,或者必须拖入相关的依赖项。
e.g。常见Java API的实现 - 例如servlets - 将针对Sun提供的接口包编译实现(在本例中为javax.servlet
)
如何在实施中使用它?通过导入它。如果它在同一个包中并且您正在同时编译所有接口/实现,则这是不必要的。
请注意,接口以与实现相同的方式(使用class
定义的内容)编译为.class文件。
答案 1 :(得分:6)
你没有选择。所有公共类/接口必须位于名为ClassOrInterfaceName.java的文件中。
答案 2 :(得分:4)
这些答案围绕着正确的方向跳舞。
在Java中,在一个文件中声明多个类是很奇怪的,即使你可以。不要这样做。
将IServiceAnnouncer放在单独的文件中,并在HelloWorld.java中导入类名。您只需同时编译它们,将两个文件名都传递给javac。一切正常。
公共接口与Java中的公共接口一样,是一种在任何其他类中可见且可用的类型。没有“public”,它的可见性称为package-private,这意味着只有同一个包中的东西才能使用它。
答案 3 :(得分:2)
编译器稍微松散地使用术语“类”。更通用的术语可能是“类型”。我猜测编译器使用术语“类”,因为它从每个类型声明(class
,interface
和enum
)生成相同格式的“.class”文件。 / p>
界面不一定是public
。如果声明它没有访问修饰符,则只能在其“包”中访问它。
可以(应该)在包中声明Java类型。包是应该一起构建和部署的Java类型的集合。默认情况下,包中的所有类型都是隐式导入的,因此如果您的接口位于同一个包中,它将可用于HelloWorld
类。
如果未声明包,则类型位于默认包中。因此,即使您只将IServiceAnnouncer
接口放在单独的文件中,它也可用于HelloWorld
。只需同时编译两个文件。
答案 4 :(得分:0)
在一个文件中有多个类定义的问题是以下错误,当使用版本控制并且多个开发人员正在处理同一个项目时可能会发生以下错误:
duplicate class: X
class X {
因此,最好将公共(以及非公共,顺便说一句)类放在单独的文件中。这样可以减少出现这些错误的可能性。
如果它位于同一个文件夹中,只需使用IServiceAnnouncer
,如果它位于不同的文件夹import
中。
public
。不,public
表示一种protected
(关键字protected
是禁止的,很奇怪!):它只能在同一个包中看到。如果您不确定包是什么,请查看Java Tutorial。 http://java.sun.com/docs/books/tutorial/java/package/packages.html
答案 5 :(得分:-1)
1)编译器只是抱怨你定义了2个公共顶级类型。你不能用Java做到这一点。如果您愿意,可以在您的类中嵌套接口,或者将其设置为非公开(默认可见性),但这在Java中并不常见,并且可能在这里不太有用。
2)您需要实现接口,或者可以访问实现它的对象。
3)接口可以是公共的,也可以是默认(包)可见性。界面中的方法不需要public修饰符,因为默认情况下它们是公共的。