一个源文件里能定义多个class,但是有且只能有一个public类,非public类的名字只要符合java标识符规则就可以,public类的名字必须和源文件名一致。
至于为什么有这个规定,很多网上的帖子都说是为了方便JVM根据文件名找到main函数入口,个人觉得这种说法不太可信也不太合理。原因如下:
JVM读取的是编译后的.class文件而不是.java源文件,而定义在一个源文件中的多个类编译后都生成了由各自类名命名的.class文件。在我看来当初java的设计者这样规定的主要目应该是为了给源码阅读提供便利,试想一下如果一个源文件中可以有多个public的class而且名字与源文件名不一致,那么当我们在阅读代码时想要了解某个引用类的定义情况应该去哪找这个类的源代码呢?
当有了这个规定之后我们就可以根据import的包名和类名准确找到源文件的位置。至于源文件中的其他非public类,他们只能被本包内的类使用,使用范围有限,命名也就没有严格要求了