Должен ли я поместить открытый интерфейс в отдельный файл?
у меня есть следующий код:
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 жалуется на этот код. Он пишет, что класс IServiceAnnouncer
является общедоступным, и он должен быть объявлен в файле с именем "IServiceAnnouncer.ява."
у меня несколько вопросов по этому поводу:
почему компилятор сказал, что
IServiceAnnouncer
- это класс? Это интерфейс. Или интерфейс является частичным случаем класс?если я поставлю интерфейс
IServiceAnnouncer
в отдельном файле под названием "IServiceAnnouncer.java " (как хочет компилятор), как тогда я могу использовать его из "HelloWorld.java"?Что значит
public interface
в смысле? В чем разница между публичным и непубличным интерфейсом?
6 ответов
вы должны поместить его в отдельный файл. Таким образом, проще поменять местами в другой реализации или сделать интерфейсы (API вашей системы) доступными для других, чтобы кодировать, не зная деталей вашей реализации или перетаскивая связанные зависимости.
например, реализации общих API Java - например, сервлеты - будут иметь реализацию, закодированную против пакета интерфейсов, предоставляемых Sun (в этом случае javax.servlet
)
Как может вы используете его из своей реализации ? Импортируя его. Это не нужно, если он находится в одном пакете, и вы компилируете все свои интерфейсы/реализации сразу.
обратите внимание, что интерфейс компилируется до a .файл класса так же, как и реализация (что вы определяете с помощью class
).
У вас нет выбора. Все открытые классы / интерфейсы должны находиться в файлах с именем ClassOrInterfaceName.Ява.
эти ответы танцуют вокруг правой.
- Да, вы можете объявить несколько классов в одном файле на Java.
- вы не можете объявить более одного открытого класса, потому что:
- имя открытого класса должно совпадать с именем файла, содержащего его; это ваша ошибка компиляции
в Java очень странно объявлять несколько классов в одном файле, даже если вы можете. Не делай этого.
вы ставите IServiceAnnouncer в отдельный файл и импортируйте имя класса в HelloWorld.Ява. Вы просто компилируете их одновременно, передавая оба имени файлов javac. Это все работает.
открытый интерфейс, как и все остальное, что является общедоступным в Java, является типом, который виден и может использоваться из любого другого класса. Без "public" его видимость называется package-private, что означает, что его могут использовать только вещи в одном пакете.
компилятор использует термин "класс" немного свободно. Более общим термином может быть "тип". Я предполагаю, что компилятор использует термин "класс", потому что он производит".class " файлы одного формата из каждого объявления типа (class
, interface
и enum
).
интерфейс не должен быть public
. Если он объявлен без модификатора доступа, к нему можно получить доступ только в его "пакете"."
тип Java может (должен) быть объявлен в пакете. Пакеты коллекция типов Java, которые должны быть построены и развернуты вместе. По умолчанию все типы в пакете неявно импортируются, поэтому, если ваш интерфейс находится в одном пакете, он будет доступен для HelloWorld
класса.
когда вы не объявляете пакет, тип находится в пакете по умолчанию. Так что даже если вы просто поставить IServiceAnnouncer
интерфейс в отдельном файле, он будет доступен для HelloWorld
. Просто скомпилируйте оба файла одновременно.
-
проблема с более чем одним определением класса в одном файле заключается в следующей ошибке, которая может возникнуть при использовании управления версиями и нескольких разработчиков, работающих над одним проектом:
duplicate class: X class X {
таким образом, предпочтительно размещать открытые (а также непубличные, кстати) классы в отдельных файлах. Это уменьшит вероятность возникновения таких ошибок.
если он находится в той же папке, просто используйте
IServiceAnnouncer
, если он находится в другой папке,import
его.public
виден из всех пакетов. Нет!--3--> означает своего родаprotected
(в то время как ключевое словоprotected
запрещено, странно ха!): это видно только изнутри того же пакета. Если вы не знаете, что такое пакет, ознакомьтесь с учебником Java. http://java.sun.com/docs/books/tutorial/java/package/packages.html
1) компилятор просто жалуется, что у вас есть 2 открытых типа верхнего уровня. Вы не можете сделать это в Java. Вы можете вложить интерфейс в свой класс, если хотите, или сделать его непубличным (видимость по умолчанию), но это не слишком распространено в Java и, вероятно, не слишком полезно здесь.
2) вам нужно либо реализовать интерфейс, либо иметь доступ к объекту, который его реализует.
3) интерфейсы могут быть либо общедоступными, либо видимостью по умолчанию (пакет). Методы в интерфейсе не нуждаются в общедоступном модификаторе, поскольку они являются общедоступными по умолчанию.