Почему у файла Java должно быть то же имя, что и у его открытого класса? [Дубликат]

Possible Duplicate:
Why filename in java should be same as class name?

У меня есть один файл с именемtemp.java, Я написал следующий код. Почему это работает?

<code>class demo //not public keyword and not same as filename
{
    public static void main(String []args)
    {
        System.out.println("this is Main method");
    }
}
</code>

Любой, почему это не работает?

<code>public class demo
{
    public static void main(String []args)
    {
        System.out.println("this is Main method");
    }
}
</code>
 Chetter Hummin04 мая 2012 г., 06:37
Пожалуйста, посмотрите на следующую ссылкуwiki.answers.com/Q/…
 Zsw25 сент. 2015 г., 23:20
Как этот вопрос помечается как дубликат без ссылки на дубликат? Это какое-то наследие магии 2012 года?
 Hovercraft Full Of Eels04 мая 2012 г., 06:35
Потому что этоlaw!
 snorbi13 нояб. 2015 г., 07:41
Это правило в языке. Другие языки, например Xtend - нет таких ограничений.
 Rishab Shinghal19 нояб. 2017 г., 13:02
Я хотел бы ответить простым языком, если класс упоминается в других единицах компиляции (файлы вне пакета, файлы в пакете), то компилятор делает две вещи: 1) Он ищет этот класс в пути к классам, но его обязанность программы сообщать, где находится путь к классам, этот класс существует. 2) Он ищет имя файла, совпадающее с именем класса в текущем пути к классам, когда он получает требуемый файл, то он ищет имя класса внутри файла. Если в любом из вариантов все в порядке, то компиляция также идет хорошо.

Ответы на вопрос(1)

package private & quot; (без модификаторов), что означает, что только классы в одном пакете могут получить к нему доступ. Во втором примере вы объявили его публичным.

Это сценарий, в котором компилятор достаточно хорошо соответствует JLS.

JLS заявляет:

When packages are stored in a file system (§7.2.1), the host system may choose to enforce the restriction that it is a compile-time error if a type is not found in a file under a name composed of the type name plus an extension (such as .java or .jav) if either of the following is true:

The type is referred to by code in other compilation units of the package in which the type is declared. The type is declared public (and therefore is potentially accessible from code in other packages).

This restriction implies that there must be at most one such type per compilation unit. This restriction makes it easy for a compiler for the Java programming language or an implementation of the Java virtual machine to find a named class within a package; for example, the source code for a public type wet.sprocket.Toad would be found in a file Toad.java in the directory wet/sprocket, and the corresponding object code would be found in the file Toad.class in the same directory.

Это означает, что для сценария 1, потому что у вас есть толькоtemp.java с пакетом частного классаdemo, он не упоминается кодом в каких-либо других единицах компиляции пакета, поэтому он будет компилироваться без проблем.

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

Если вы создали другой класс в своем первом сценарии (в том же пакете), а затем попытались сослаться на классdemo, вы должны получить ошибку компиляции.

Ваш ответ на вопрос