Компиляция Java файла .java без публичного класса

Хорошо, поэтому исходный файл java должен иметь хотя бы один открытый класс, и файл следует называть "class-name.java". Достаточно справедливо.

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

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Display the string.
    }
}

Но что меня беспокоит, если я удалю "общедоступный" модификатор доступа из приведенного выше кода, код все еще компилируется. Я просто не понимаю. Извлекая его, код выглядит так:

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Display the string.
    }
}

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

Итак, мой вопрос в том, как скомпилировать вышеуказанный код? Файл HelloWorld.java в этом случае не имеет "общедоступного" класса HelloWorld (только пакетно-закрытый HelloWorld.class), и, таким образом, мое понимание не должно компилироваться.

Оцените свое время, отвечая на мои вопросы!

С уважением, Тотчас

Ответ 1

исходный файл java должен иметь как минимум один открытый класс, а файл следует называть class-name.java

Неправильно, класс верхнего уровня не должен быть объявлен общедоступным. Состояние JLS;

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

См. http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#104285 раздел 6.6.1.

Ответ 2

Вы можете помещать непубличный класс в файл, и это не ошибка, а функция.

Ваша проблема заключается в уровне упаковки, а не компиляции. Поскольку вы можете скомпилировать этот файл с непубличным классом, но вы не можете его вызывать извне, поэтому он не работает как базовый класс приложения

Вот так:

// [+] single file: SomeWrapper.java 

public class SomeWrapper {
    ArrayList<_PrivateDataType> pdt;
}
// [-] single file: SomeWrapper.java 

// [+] single file: _PrivateDataType.java 
class _PrivateDataType {
    // members, functions, whatever goes here
}

// [-] single file: _PrivateDataType.java 

Ответ 3

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

В Java основная функция не является чем-то особенным. Там просто существует команда терминала, которая может вызывать статические методы, называемые main...

Ответ 4

Об этом нечего задумываться. Я полагаю, что это поведение похоже на одно из некоторых компиляторов C/С++.

Такой код, как "void main() {/.../}", будет скомпилирован этими компиляторами правильно, хотя он не соответствует стандартам. Проще говоря, компилятор обменивает "пустоту" на "int".

Я думаю, что подобное поведение реализовано компилятором java.

С уважением, xong

Ответ 5

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

Ответ 6

Если вы не укажете модификатор доступа класса (или его поле или метод), ему будет присвоен доступ по умолчанию. Это означает, что он доступен только из одного пакета (в данном случае пакета по умолчанию).

На веб-сайте Javabeginner.com есть статья по этому вопросу - вы должны ознакомиться с модификаторами доступа в Java, либо с этого сайта, либо другие.