Класс в нескольких файлах java

Сколько public классов может быть в одном файле?

Изучаю Java по учебнику К.Сьерра и Б.Бейтса «Изучаем Java 2-е издание 2012», там есть пример кода программы состоящей из трёх классов, все три класса имеют приставку public, но когда я переписал код и попытался запустить, командная строка выдала что-то типа «имя вашего public-класса должно совпадать с именем файла». Так как название у файла одно, а классов целых три я предположил что public-класс может быть тоже только один. В итоге я оставил public только у того класса, где есть main. Заработало, но теперь я не знаю, был ли я прав насчет того, что в программе может быть только один public класс? Но ведь тогда это значит что в учебнике ошибка? Либо у меня какая-то другая Java, которая изменилась со времён выпуска учебника в 2012 году. Могу приложить скрины из учебника, если понадобится. Код пишу в Notepad++, программы запускаю через командную строку Windows, если это имеет значение.

В одном файле может быть много классов, но публичным должен быть том, что назван как файл. Остальные в этом файле — без паблик

Если вы про три класса на 69 -70 странице, то в конце 68-ой страницы написано: Классы: GuessGame.class , Player.class , GameLancher.class — подразумевается, что это три файла, но акцент на этом не делается и новичку может быть непонятно, согласен.

Читайте также:  Python append element to list python

Я такое встречал , читая книги. Я не знаю что хотел этим сказать автор . Скорее всего то , что каждый класс находится в отдельном файле.

@pavlofff именно про них. Не знаю, как там может подразумеваться три файла, до этого момента читателя за ручку ведут начиная с самых азов, и я не помню чтобы там вообще учили запускать программу, состоящую из нескольких файлов. Я вот понятия не имею как это сделать. Видимо ошибка в книге все-таки.

Запускается файл, содержащий публичный метод main() (точку входа), остальное происходит без вашего участия, компилятор сам найдет нужные ему файлы.

Источник

Класс в нескольких файлах java

И этот код будет компилироваться. Если вы используете NetBeans, то при сборке проекта у вас появится директория build/classes в которой вы сможете найти два файла class — их имена совпадают с именами классов. Теперь попробуем разобраться зачем такое описание может потребоваться.
Такие «закрытые» классы вы можете использовать ТОЛЬКО в том же пакете, в котором они находятся. Значит вы можете описать класс, который никто не увидит. Что в некоторых ситуациях бывает удобно. Например вы создаете класс, логика работы которого удобно разбивается на несколько классов. Т.е. удобно объявить еще один и больше классов. Но с другой стороны об этих вспомогательных классах другим классам в других пакетах лучше вообще не знать. Инкапсуляция на классовом уровне 🙂
Я не предлагаю прямо сейчас бросаться придумывать ситуации, когда это может вам потребоваться — как только вы в такую ситуацию попадете, то просто будете знать, что есть и такая возможность объявить класс.
Когда вы набираете определенный опыт, нередко становится достаточным просто узнать о существовании каких-либо интересных механизмов, технологий, конструкций — вы уже «угадываете», что «эта штука любопытная и о ней надо помнить, а может и покопаться». Опыт конкретного использование — это уже второй шаг. Не всегда все работает так, как описано в документации.

Читайте также:  Button with background image html

Вложенные классы

Итак, с несколькими классами внутри одного файла разобрались. Но это еще не все — вы можете объявить класс ВНУТРИ класса. Причем в отличии от предыдущего пункта здесь есть некоторый полет для фантазии по закрытости/открытости. Для простоты создадим три класса в двух разных пакетах — один класс будет использоваться для объявления классов внутри него (ResearchClass). Еще один класс (FirstClass) будет нахоится в том же пакете, а другой класс (SecondClass) в другом пакете. Вот такие у нас будут классы (обратите внимание на директиву package — именно там видно где какой класс находится):

Источник

В Java мы можем разделить класс на несколько файлов

@asgs, я думаю, он имеет в виду написание одного и того же класса в двух разных физических файлах, которые скомпилированы в один класс.

@Sanjeevakumar: трудно сказать, спрашивает ли он об источнике ( .java ) или скомпилированных классах ( .class ).

@Joachim, я использую эту функцию в C # все время partial писать код пользовательского интерфейса. Я не знаю, на Яве. Я думал, что это то, что спрашивают здесь.

@Sanj: да, я читал об этом. И насколько я знаю, это только разделяет источник (что, конечно, неплохо). По моему мнению, если язык нуждается в этом, то что-то не так с фреймворками: почему должна создаваться половина моего файла, а другая половина должна быть написана от руки? Мне нравится, что мое разделение происходит на уровне класса (например, создать базовый класс, написать вручную расширяющий класс). Но это только мое личное мнение.

Да, есть компромиссы, и вы все еще можете достичь этой чистоты, это просто дополнительная опция, когда вам это действительно нужно. 🙂

@Joachim: по моему опыту, использование наследования для разделения создает некоторые действительно уродливые проблемы. Например, как сгенерированный код должен создать новый экземпляр того же класса? Нужно было бы знать, какой пользовательский подкласс для создания экземпляра . в основном наследование имеет всевозможные проблемы, и использование его для решения проблемы смешения ручного кода и автоматически сгенерированного кода не является хорошей идеей IMO.

@Jon: интересно. Я никогда не понимал необходимость этой функции (и я совсем не чувствую себя в мире .NET). Но ваши «большие пальцы» должны означать, что это стоит посмотреть 😉

Aspectj может быть функцией частичного класса C #! Spring Roo является одной из типичных сред разработки, использующих аспектj для разделения функций класса на

6 ответов

Нет, весь класс должен находиться в одном файле на Java.

Если вы думаете о функции «частичных типов» С#, в Java нет эквивалента. (Если вы не думали о С#, игнорируйте это:)

@Basic: я не согласен. Хотя частичные типы, безусловно, полезны в C #, они далеко не самая важная вещь в C #, которая отсутствует в Java. Если бы это был «огромный недосмотр» в Java, вы бы подумали, что дизайнеры C # включили бы его в C # 1 — но это было введено только в C # 2.

Это может быть хорошей идеей, если класс действительно настолько велик, что внедренные концепции нелегко понять. Я вижу два разных способа сделать это:

  • Использовать наследование: Переместить общие понятия класса в базовый класс и извлечь из него специализированный класс.
  • Использование агрегации: Перемещение частей вашего класса в отдельный класс и установление отношения ко второму классу с использованием ссылки.

Как уже упоминалось ранее, в Java нет понятия, как частичные классы, поэтому вам действительно нужно использовать эти механизмы ООП.

Используя только javac , это невозможно. Разумеется, вы могли бы объединить несколько файлов в один .java файл как часть процесса сборки и вызвать javac впоследствии, но это было бы громоздким на стольких уровнях, что вряд ли будет полезно.

Возможно, вы могли бы объяснить свою проблему, тогда мы можем помочь лучше.

Если вы чувствуете, что ваши .java файлы слишком велики, вам, вероятно, стоит подумать о рефакторинге.

Конечно, это возможно, но я не считаю это полезным вообще.

Чтобы начать, деление на самом деле не вопрос, я думаю, вы просто скомпилируете файл и разделите его, какой бы вы ни хотели.

Теперь, чтобы собрать их обратно, все, что вам нужно сделать, это написать пользовательский загрузчик классов, который загружает все части, объединяет их в один байт-массив, а затем вызывает defineClass() .

Как я уже сказал, это выглядит довольно бессмысленно и, вероятно, не то, что вы хотите, и определенно не то, что вам нужно, но это технически возможно.

(Я сделал что-то подобное однажды как шуточный способ обфускации кода: байты файла класса были рассеяны в константах всех других классов приложения. Было весело, я должен признать.)

Источник

В Java, мы можем разделить класс на несколько файлов

Любая возможность разделить класс на несколько физических файлов с помощью Java?

Нет, весь класс должен быть в одном файле в Java.

Если вы’вновь думать о C#и#39;ы с «частичным видах на» тут’s нет эквивалент в Java. (Если вы были’т думаю на C#, это игнорировать 🙂

Это может быть хорошей идеей, если класс действительно настолько большие, такие, что выполнены понятия не легко понять. Я вижу два способа сделать это:

  1. Использовать наследование: переход общие понятия класса, базовый класс и производные специализированный класс от него.
  2. Использование агрегации: перемещение части вашего класса в отдельный класс и установлении отношений ко второму классу, используя ссылку.

Как уже упоминалось ранее, не существует понятия как частичные классы в Java, так что вы действительно должны использовать эти механизмы ООП.

Используя только что javac , это не возможно. Можно, конечно, объединить несколько файлов в один .файл Java как часть процесса сборки, а затем вызвать и javac`, но это будет громоздко на очень многих уровнях, что это вряд ли будет полезно.

Может быть, вы могли бы объяснить вашу проблему, тогда мы можем помочь лучше.

Если вы считаете, что ваш .Java-файлы являются слишком большими, вы, вероятно, следует рассмотреть возможность рефакторинга.

Да, Вы Можете!

Начиная с Java 8, Вы имеете понятие методов по умолчанию.

вы можете разбить класс на несколько файлов/подклассы нежно АБиспользование интерфейсов

MyClassPartA.java

MyClassPartB.java

MyClass.java

public class MyClass implements MyClassPartA, MyClassPartB<>
MyClass myClass = new MyClass(); System.out.println(myClass.myMethodA()); System.out.println(myClass.myMethodB());

Вы даже можете передавать переменные между классами/файлы с абстрактным геттеры и сеттеры, что необходимо реализовать/переопределить в основном классе или суперклассе, что однако.

Конечно, это возможно, но я не’т думаю, что это’s, удобен вообще.

Для начала, разделите это’t действительно вопрос, я думаю, вы просто скомпилировать файл и разбить его в зависимости от того, как вы хотите.

Теперь, чтобы положить их обратно вместе, все, что вам нужно сделать, это создать пользовательский загрузчик класса, который загружает все предметы, объединяет их в единый массив байтов, затем называет defineClass()`.

Как я уже сказал, это выглядит довольно бессмысленно и, наверное, не то, что вы хотите, и наверняка не то, что нужно, но это технически возможно.

(Я сделал что-то подобное когда-то, как шутят, маскируя код: байты файла класса были разбросаны в константы всех остальных классов в приложении. Это было весело, надо признать.)

Источник

Оцените статью