소스 파일 하나에 톱레벨 클래스를 여러 개 선언하는 것은 가능은 하지만 아무런 장점이 없기 때문에 피해야 한다.
한 파일 안에 여러 개를 선언하면 한 클래스를 여러 가지로 정의할 수 있게 되는데, 이렇게 되면 어느 소스 파일을 먼저 컴파일하느냐에 따라 동작이 달라지게 된다.
// Foo.javaclassFoo {staticfinalString NAME ="Foo - foo";}classBar {staticfinalString NAME ="Foo - bar";}// Bar.javaclassBar {staticfinalString NAME ="Bar - bar";}classFoo {staticfinalString NAME ="Bar - foo";}// Main.javapublicclassMain {publicstaticvoidmain(String[] args) {System.out.println(Foo.NAME);System.out.println(Bar.NAME); }}
IDE 환경에서는 애초에 중복된 클래스명을 사용할 수 없기 때문에 위와 같이 코드를 작성하면 컴파일 에러가 발생한다.
하지만 javac 명령어를 통해 직접 컴파일하면 실행한 명령어에 들어간 인수에 따라 다른 결과가 출력된다.