Может ли файл java иметь более одного класса?

105

Зачем нужно иметь более одного класса в файле Java? Я новичок в Java.

Отредактировано: этого можно достичь, создав внутренний класс внутри общедоступного класса, верно?

Yesraaj
источник

Ответы:

128

Да, оно может. Однако для каждого файла может быть только один общедоступный класс верхнего уровня.java , а общедоступные классы верхнего уровня должны иметь то же имя, что и исходный файл.

Цель включения нескольких классов в один исходный файл - связать связанные функции поддержки (внутренние структуры данных, классы поддержки и т. Д.) Вместе с основным общедоступным классом. Обратите внимание, что всегда нормально не делать этого - единственное влияние на читаемость (или нет) вашего кода.

Шон Рейли
источник
1
Я думаю, что это хорошая идея, если вы хотите сохранить эти дополнительные классы закрытыми, чтобы их можно было полностью изменить позже, не нарушая ничего, что случайно использует эти классы.
Эрих Китцмюллер,
3
Он существует для совместимости с 1.0 (до вложенных классов). Это большая ошибка в языке. Самым большим преимуществом его использования является безнадежная обработка файлов в IDE.
Том Хотин - tackline
25
Один общедоступный класс верхнего уровня для каждого файла. Для каждого файла может быть столько публичных внутренних классов, сколько вам нужно.
erickson 09
@Tom, какая часть, по вашему мнению, является ошибкой, внутренние классы или несколько классов верхнего уровня для каждого файла?
finnw
@finnw Несколько классов верхнего уровня для каждого файла. Это так неправильно. Где java.awt.LightweightDispatcher?
Том Хотин - tackline
17

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

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

  public static Comparator MyComparator = new Comparator() {
    public int compare(Object obj, Object anotherObj) {

    }
  };

Класс Comparator обычно требует отдельного файла, чтобы быть общедоступным. Таким образом, он связан с классом, который его использует.

Кгианнакакис
источник
1
Это не совсем частный класс, если он находится в файле без модификатора. У вас не может быть частного класса, если он не является внутренним классом, потому что если бы вы это сделали, кто бы мог его использовать?
Бьорн
10

Да сколько угодно!

НО, только один «публичный» класс в каждом файле.

Альберто
источник
6

Файл .java называется единицей компиляции. Каждая единица компиляции может содержать любое количество классов и интерфейсов верхнего уровня. Если нет общедоступных типов верхнего уровня, то единицу компиляции можно назвать как угодно.

//Multiple.java
//preceding package and import statements

class MyClass{...}
interface Service{...}
...
//No public classes or interfaces
...

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

//Test.java
//named exactly as the public class Test
public class Test{...}
//!public class Operations{...}
interface Selector{...}
...
//Other non-public classes/interfaces

Важные моменты об основном методе - часть 1

Часть 2

(Пункты, касающиеся количества классов и их уровней доступа, рассмотренных в части 2)

Утсав
источник
5

Да, вы можете создать более одного общедоступного класса, но это должен быть вложенный класс.

public class first {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
    }

    public class demo1
    {

        public class demo2
        {

        }
    }
}
Ганеш
источник
4

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

Это позволяет вам создать два тесно связанных класса, например модель и ее представление, не раскрывая их реализации. Другой пример - коллекция и ее итераторы.

Рич Аподака
источник
4

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

Исключение составляют случаи, когда класс лучше всего реализовать с использованием одного или нескольких небольших вспомогательных классов. Обычно за кодом легче всего следовать, когда эти классы присутствуют в одном файле. Например, вам может понадобиться небольшой класс-оболочка «кортеж» для передачи некоторых данных между вызовами методов. Другой пример - классы «задачи», реализующие Runnable или Callable. Они могут быть настолько маленькими, что их лучше всего комбинировать с родительским классом, создающим и вызывающим их.

Спутанность сознания
источник
4

Да 200% ,

Пример:

class A {
 void methodDeclaration() { System.out.println("!!!"); }
 }
 class B {
 public static void main(String[] args) {
new A().methodDeclaration();
    }
 }
Шиванандам
источник
2

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

Миту Чоудхари
источник
1

Варьируется ... Одним из таких примеров могут быть анонимные классы (вы встретите их много при использовании прослушивателей событий и т. Д.).

лагинимайнеб
источник
1

Я думаю, что это должно быть «в каждом файле .java может быть только один НЕСТАТИЧЕСКИЙ публичный класс верхнего уровня». Не так ли?

HolidayCactus
источник
Вам следует задать это как вопрос, а не отвечать здесь.
Ашиш Кумар
1

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

Прочтите эту статью в вики,

https://en.wikipedia.org/wiki/Singleton_pattern

На осмысление концепции нужно время.

chrismjh
источник
1

В файле .java может быть только один общедоступный класс верхнего уровня, имя которого совпадает с именем файла, но может быть несколько общедоступных внутренних классов, которые можно экспортировать для всех и получить доступ к полям / методам внешнего класса, например : AlertDialog.Builder (изменено "public static") в AlertDialog (изменено "public")

Баоян
источник
1

Да. В одном файле .Java может быть более одного класса. Но вы должны сделать одну из них общедоступной. и сохраните файл .java с тем же именем, что и имя публичного класса. когда вы скомпилируете этот файл .java, вы получите отдельные файлы .class для каждого класса, определенного в файле .java.

Кроме того, существует слишком много методов для определения более одного класса в одном файле .java.

  1. использовать концепцию внутренних классов.
  2. Используйте понятие анонимных классов.
Гаурав Варшней
источник
1

Да ! .java файл может содержать только один публичный класс.

Если вы хотите, чтобы эти два класса были общедоступными, их нужно поместить в два файла .java: A.java и B.java.

Ракеш Сингх
источник
2
Я не уверен, что ваш ответ добавляет что-нибудь еще из 12 других ответов
goto
1

Да, внутри файла .java может быть более одного класса. Максимум один из них может быть публичным. Остальные являются частными пакетами. Они НЕ МОГУТ быть частными или защищенными. Если один из них является общедоступным, файл должен иметь имя этого класса. В противном случае этому файлу может быть присвоено ВСЕ ЧТО.

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

Для более подробного расследования вы можете посетить мою запись в блоге здесь .

Мертер Суалп
источник
1
Добро пожаловать в Stack Overflow! Я ценю, что вы изложили информацию, которая здесь еще не была раскрыта. Вы также хорошо процитировали свое сообщение в блоге, заявив о праве собственности и включив сюда соответствующую информацию. Если вы решите вносить больший вклад в этот сайт в будущем (а я надеюсь, что вы это сделаете), обязательно прочтите эту статью, чтобы убедиться, что ваши сообщения и дальше будут хорошо приниматься, если вы цитируете свой блог.
4castle
0

Может быть только один верхний уровень публичного класса файле . Имя класса этого открытого класса должно быть именем файла. У него может быть много общедоступных внутренних классов.

В одном файле может быть много классов. Ограничения для различных уровней видимости классов в файле следующие:

Классы верхнего уровня:
1 публичный класс
0 частный класс
любое количество классов по умолчанию / защищенных

Внутренние классы:
любое количество внутренних классов с любой видимостью (по умолчанию, частные, защищенные, общедоступные)

Пожалуйста, поправьте меня, если я ошибаюсь.

Лакшмикант Дешпанде
источник
0

Да, оно может. Однако для каждого файла .java может быть только один общедоступный класс, так как общедоступные классы должны иметь то же имя, что и исходный файл.

user3077069
источник