lasses múltiplas em um único arquivo Java, cada uma com um método principal - comportamento inesperad

Eu tenho o seguinte código em um arquivo chamado test.java, localizado dentro do diretório C: \ D \ JavaProjects

class test
{
        public static void main( String[] str )
        {
                System.out.println( "Hello, World! from test" );
        }
}

class Test
{
        public static void main( String[] str )
        {
                System.out.println( "Hello, World!" );
        }
}

Quando faço o "javac test.java", ele gera test.class. Agora, se eu fizer o "teste java", obtenho a seguinte saída:

Exceção no segmento "main" java.lang.NoClassDefFoundError: test (nome errado: Test) em java.lang.ClassLoader.defineClass1 (método nativo) em java.lang.ClassLoader.defineClassCond (fonte desconhecida) em java.lang.ClassLoader .defineClass (fonte desconhecida) em java.security.SecureClassLoader.defineClass (fonte desconhecida) em java.net.URLClassLoader.defineClass (fonte desconhecida) em java.net.URLClassLoader.access $ 000 (fonte desconhecida) em java.net.URLClassLoader $ 1 .run (fonte desconhecida) em java.security.AccessController.doPrivileged (método nativo) em java.net.URLClassLoader.findClass (fonte desconhecida) em java.lang.ClassLoader.loadClass (fonte desconhecida) em sun.misc.Launcher $ AppClassLoader .loadClass (fonte desconhecida) em java.lang.ClassLoader.loadClass (fonte desconhecida) Não foi possível encontrar a classe principal: test. O programa irá encerrar

Mas quando eu faço "java Test" eu recebo

Olá Mundo

Agora, se eu simplesmente inverter a ocorrência das duas declarações de classe, de modo que Test seja declarado ANTES do teste, o compilador java emitirá o arquivo Test.class. Agora, fazendo "java test" fornece a saída:

Olá Mundo! do teste

mas "java Test" fornece

Exception no encadeamento "main" java.lang.NoClassDefFoundError: Test (nome errado: test) em java.lang.ClassLoader.defineClass1 (método nativo) em java.lang.ClassLoader.defineClassCond (fonte desconhecida) em java.lang.ClassLoader .defineClass (fonte desconhecida) em java.security.SecureClassLoader.defineClass (fonte desconhecida) em java.net.URLClassLoader.defineClass (fonte desconhecida) em java.net.URLClassLoader.access $ 000 (fonte desconhecida) em java.net.URLClassLoader $ 1 .run (fonte desconhecida) em java.security.AccessController.doPrivileged (método nativo) em java.net.URLClassLoader.findClass (fonte desconhecida) em java.lang.ClassLoader.loadClass (fonte desconhecida) em sun.misc.Launcher $ AppClassLoader .loadClass (fonte desconhecida) em java.lang.ClassLoader.loadClass (fonte desconhecida) Não foi possível encontrar a classe principal: Test. O programa irá encerrar

Agora, eu sei que é muito estranho ter duas classes com main no mesmo arquivo, mas esse comportamento parece completamente ilógico e mais como um bug. Alguém pode me indicar a seção apropriada da Especificação de linguagem Java que especifica esse comportamento? Muito obrigado antecipadamente pela ajuda.

questionAnswers(3)

yourAnswerToTheQuestion