Ответ 1
Существует практическая причина для разделения декларации в С++, и это позволяет скомпилировать исходные файлы отдельно. В Java нет такой необходимости (поскольку все скомпилировано для байт-кода отдельно), поэтому это не разрешено.
Я программист на С++, изучающий Java, и мне интересно, следует ли ООП в Java следовать тому же принципу разделения определения класса и объявления, как это делает С++. поместите их как в отдельные файлы. Я просмотрел интернет, включая веб-сайт разработчика Android, и весь код, с которым я столкнулся, имеет определение и объявление, выполненные одновременно.
Разве это просто одно из отличий между разработкой в С++ и разработкой в Java, или же источники, на которые я смотрел, просто делали так, чтобы ограничить сложность своего кода для публикации в Интернете? Я видел декларации и определения, объединенные в некоторых документах на С++, хотя я знаю, что это плохая практика.
Существует практическая причина для разделения декларации в С++, и это позволяет скомпилировать исходные файлы отдельно. В Java нет такой необходимости (поскольку все скомпилировано для байт-кода отдельно), поэтому это не разрешено.
Следующий ответ был отредактирован в значительной степени на основе комментариев.
Вам не нужно разделить свой класс на определение и декларацию исключительно для компилятора, так как нет необходимости в форвардных объявлениях в Java (как есть в С++). Вы можете разделить определение класса и объявление на пару интерфейса/класса (или пару [abstract] class/class) из-за требований к дизайну, например:
Однако это более похоже на использование виртуального базового класса и конкретных классов реализации на С++ и часто называется "программированием для интерфейса". Вы можете подробнее прочитать технику в этой статье (с некоторыми аргументами, почему вы можете предпочесть использовать абстрактный класс вместо интерфейса в качестве базы). Кроме того, такое расщепление следует рассматривать осторожно; во многих случаях расщепление класса является просто излишним излишеством и приведет к ненужному раздуванию кода.
Таким образом, короткий ответ таков: вам не нужно разделить класс только для того, чтобы иметь объявление вперед (которое задает исходный вопрос), хотя вы можете сделать это, если есть причина дизайна ( но это не эквивалент разделения файлов заголовка/класса С++).
В Java у вас нет выбора: имя класса связано с именем файла. Для файла с именем x/y/z/T.java
из корня исходных файлов T.java
должен выглядеть следующим образом:
package x.y.z;
[some modifiers here] class T {
// class T here
}
Есть способы отделить "определение класса" от "реализации", наиболее близким к тому, что вы имеете в виду, это объявление интерфейса I
и реализация класса C
I
. Также рассмотрим абстрактные классы.
Интерфейс имеет то же самое ограничение, за исключением того, что вы объявляете interface
вместо class
. Абстрактный класс - это просто класс с модификатором abstract
.
В Java у вас есть один класс в одном файле, т.е. вы не можете - и не должны - разделять классы по нескольким файлам (вы можете иметь несколько непубличных классов в одном файле).
Что вы можете сделать, это использовать интерфейсы, т.е. определить интерфейс для класса в одном файле и реализовать этот интерфейс в классе в другом файле. Если вы затем распространяете API, вы просто распространяете интерфейс.
В Java нет заголовков и исходных файлов, как у вас на С++. Если вы хотите отделить объявление класса от его реализации, вы можете определить интерфейс, который объявляет методы, а затем создать класс, реализующий интерфейс.
Разделение, о котором вы пишете, не существует в Java. Вы можете разделить определения методов (нестатические) на interface
.
Нет, такого разделения нет в java. Но посмотрите на ключевое слово интерфейса. вы можете явно объявлять интерфейсы!