Может ли файл Java иметь более одного класса? - PullRequest
100 голосов
/ 09 июня 2009

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

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

Ответы [ 17 ]

122 голосов
/ 09 июня 2009

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

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

17 голосов
/ 09 июня 2009

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

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

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

    }
  };

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

10 голосов
/ 09 июня 2009

Да, столько, сколько вы хотите!

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

5 голосов
/ 10 мая 2014

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

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

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

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

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

4 голосов
/ 09 июня 2009

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

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

4 голосов
/ 09 июня 2009

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

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

4 голосов
/ 02 мая 2017

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

public class first {

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

    public class demo1
    {

        public class demo2
        {

        }
    }
}
3 голосов
/ 05 марта 2017

Да, 200% ,

Пример:

class A {
 void methodDeclaration() { System.out.println("!!!"); }
 }
 class B {
 public static void main(String[] args) {
new A().methodDeclaration();
    }
 }
2 голосов
/ 16 октября 2012

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

2 голосов
/ 09 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...