Чи може файл java мати більше одного класу?


105

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

Відредаговано: Цього можна досягти, створивши внутрішній клас всередині публічного класу, правда?


Відповіді:


128

Так, це може. Однак на файл може бути лише один загальнодоступний клас вищого рівня.java , і загальнодоступні класи вищого рівня повинні мати те саме ім’я, що і вихідний файл.

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


1
Я думаю, що це добре зробити, якщо ви хочете зберегти ці додаткові класи приватними, щоб вони могли бути повністю змінені пізніше, не порушуючи нічого зовні, що випадково використовує ці класи.
Еріх Кіцмюллер

3
Там передбачено сумісність 1.0 (до вкладених класів). Це велика помилка в мові. Найбільшою перевагою його використання є те, що IDE мають безперспективну обробку файлів.
Том Хотін - тайклін

25
Один загальнодоступний клас вищого рівня на файл. У файлі може бути стільки загальнодоступних внутрішніх класів, скільки вам подобається.
erickson

@Tom, яка частина, на вашу думку, помилка, внутрішні класи чи кілька класів вищого рівня в одному файлі?
finnw

@finnw Кілька класів верхнього рівня на файл. Це просто так неправильно. Де java.awt.LightweightDispatcher?
Том Хотін - тайклін

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
...

У блоці компіляції може бути лише один публічний клас / інтерфейс. Куб повинен бути названий точно так, як цей загальнодоступний тип вищого рівня.

//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

Я думаю, що це повинно бути "може бути лише один публічний клас вищого рівня NON-STATIC на .java файл". Чи не так?


Ви повинні ставити це як питання, а не відповідати тут.
Ашиш Кумар

1

Якщо ви хочете реалізувати синглтон, тобто клас, який працює у вашій програмі із лише одним екземпляром пам’яті протягом усього виконання програми, то одним із способів реалізації синглтона є гніздування приватного статичного класу всередині загальнодоступного класу . Тоді внутрішній приватний клас інстанціює себе лише тоді, коли викликається його публічний метод доступу до приватного примірника.

Перегляньте цю статтю у вікі,

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

Концепція потребує певного часу, щоб жувати.


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 інших відповідей
перейдіть

1

Так, ви можете мати декілька класів у файлі .java. Принаймні, одна з них може бути публічною. Інші пакетно-приватні. Вони НЕ можуть бути приватними або захищеними. Якщо він є загальнодоступним, у файлі повинно бути назва цього класу. Інакше цьому файлу як імені може бути надано будь-що.

Наявність у одному файлі багатьох класів означає, що ці класи знаходяться в одному пакеті. Тому будь-які інші класи, які знаходяться всередині цього пакету, але не у цьому файлі, також можуть використовувати ці класи. Крім того, коли цей пакет імпортується, клас імпорту може також використовувати їх.

Для більш детального розслідування ви можете відвідати мою публікацію в блозі тут .


1
Ласкаво просимо до переповнення стека! Я вдячний, що ви пояснили інформацію, яка тут уже не висвітлювалася. Ви також зробили хорошу роботу, посилаючись на свою публікацію в блозі, декларуючи право власності та включивши сюди відповідну інформацію. Якщо ви вирішите більше внести свій внесок у цей сайт у майбутньому (і, сподіваюсь, ви це зробите), переконайтесь, що розглянути цю статтю, щоб переконатися, що ваші публікації продовжують бути добре сприйнятими, якщо ви цитуєте свій блог.
4касл

0

У файлі може бути лише один клас вищого рівня публічного класу . Ім'я класу цього публічного класу має бути ім'ям файлу. У ньому може бути багато громадських внутрішніх класів.

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

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

Внутрішні класи:
будь-яка кількість внутрішніх класів із будь-якою видимістю (за замовчуванням, приватні, захищені, загальнодоступні)

Будь ласка, виправте мене, якщо я помиляюся.


0

Так, це може. Однак у файлі .java може бути лише один публічний клас, оскільки публічні класи повинні мати те саме ім'я, що і вихідний файл.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.