最近複習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類中才能執行