最近复习java基础,无意间看见这么一个问题,为什么java 源文件中只能有一个public类?
仔细想想,貌似自己也一直这么习惯的写着代码,从没想过,为什么呢?
尝试写了如下的代码
package test.wyk.extend;
public class TestExtend {
public static void main(String[] args) {
// Child child=new Child();
// child.f();
Test test=new Test();
test.main(new String[]{"123","456"});
}
}
class Father{
public int value;
public void f(){
value=100;
System.out.println("父类的value的值为"+value);
}
}
class Child extends Father{
public int value;
public void f(){
super.f();
value=200;
System.out.println("子类的value值"+value);
System.out.println(value);
System.out.println(super.value);
}
}
class Test{
public static void main(String[] args) {
System.out.println(args[0]);
}
}
此处public类名与源文件的名称一致,不一致直接编译报错
其他非public类可以随便
总结如下:
一个源文件里能定义多个class,但是有且只能有一个public类,非public类的名字只要符合java标识符规则就可以,public类的名字必须和源文件名一致。至于为什么有这个规定,很多网上的帖子都说是为了方便JVM根据文件名找到main函数入口,个人觉得这种说法不太可信也不太合理。原因如下,JVM读取的是编译后的.class文件而不是.java源文件,而定义在一个源文件中的多个类编译后都生成了由各自类名命名的.class文件。在我看来当初java的设计者这样规定的主要目应该是为了给源码阅读提供便利,试想一下如果一个源文件中可以有多个public的class而且名字与源文件名不一致,那么当我们在阅读代码时想要了解某个引用类的定义情况应该去哪找这个类的源代码呢?当有了这个规定之后我们就可以根据import的包名和类名准确找到源文件的位置。至于源文件中的其他非public类,他们只能被本包内的类使用,使用范围有限,命名也就没有严格要求了
然后就是main方法一定要在public类中才能执行?其实不然
此处Test类和TestExtend类中都有main方法,但是执行入口还是public类中的main方法,我们执行完发现可以打印出"123",所以main方法不是一定要放在public类中才能执行