2014-01-20 3 views
0

Я знаю, что имя класса public, объявленного в java-файле, должно совпадать с именем его файла. Но мне интересно, как это не дает мне ошибку компиляции, а работает успешно.Опуская спецификатор доступа в java

class Foo //<-- this can be any name... 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("Hello World!"); 
    } 
} 

Я знаю, что по умолчанию используется package private. Для вышеуказанной программы имя класса и имя файла не должны быть одинаковыми. Он выполняется правильно, а не ошибка компилятора. Может ли кто-нибудь проливать свет? Спасибо.

EDIT:

Теперь я понимаю! Но меня поразил еще один вопрос. Что происходит, когда в одном файле есть два таких класса?

Ну, я думал, что файл .class будет создан вне класса, который внедрил метод main. Не было никакой ошибки компиляции, но, к моему удивлению, не было никакого файла .class. Почему это так?

+0

Храните два класса с открытым доступом в одном файле java. Один с основным и один без основного. Вы получите предупреждение или ошибку. – Rahul

+2

@Rahul: Я не понимаю, как это относится к вопросу. –

ответ

1

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

От section 7.6 of the JLS:

Если и только если пакеты хранятся в файловой системе (§7.2), хост-система может выбрать для обеспечения соблюдения ограничений, что это ошибка времени компиляции, если тип не найден в файле под именем, состоящим из имени типа плюс расширение (например, как .java или .jav), если одно из следующих условий:

  • тип называется кодом в другой компиляции единицы пакета, в котором объявлен тип.

  • Тип объявляется открытым (и, следовательно, потенциально доступен из кода в других пакетах).

Обратите внимание на второй буллит - когда ваш класс не является публичной, это ограничение не применяется.

EDIT: Из обновленного вопроса ...

Что происходит, когда в одном файле есть два таких класса?

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

+0

Посмотрите мой обновленный вопрос! – nitish712

+0

@ nitish712: См. Мое редактирование, но, пожалуйста, постарайтесь оставить один вопрос за сообщение. Это опасно относится к царству «Я все время думаю о чем-то другом, о котором я хочу спросить ...» –

+0

Мой плохой. Были созданы файлы классов. – nitish712

1

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

Если вы говорите, есть исходный файл Test003.java и вы определяете в это
два непубличных классов AAA и BBB, нет компиляции
ошибки и два файла класс генерируется: AAA.class и BBB.class.

Так что все хорошо.

01/20/2014 06:27 AM    238 AAA.class 
01/20/2014 06:27 AM    238 BBB.class 

enter image description here

+0

Посмотрите мой обновленный вопрос! – nitish712

+0

@ nitish712 Все это не имеет никакого отношения к присутствию/отсутствию основных методов. Я проверю ваш обновленный вопрос. –

+0

@ nitish712 См. Мой обновленный ответ. –

Смежные вопросы