先給結論:當然不是!!
可以有多個類,但只能有一個public的類,並且public的類名必須與文件名相一致。一個文件中可以不含public類,如果只有一個非public類,此時可以跟文件名不同。
為什么一個java源文件中只能有一個public類?
在java編程思想(第四版)一書中有這樣3段話(6.4 類的訪問權限):
- 每個編譯單元(文件)都只能有一個public類,這表示,每個編譯單元都有單一的公共接口,用public類來表現。該接口可以按要求包含眾多的支持包訪問權限的類。如果在某個編譯單元內有一個以上的public類,編譯器就會給出錯誤信息。
- public類的名稱必須完全與含有該編譯單元的文件名相同,包含大小寫。如果不匹配,同樣將得到編譯錯誤。
- 雖然不是很常用,但編譯單元內完全不帶public類也是可能的。在這種情況下,可以隨意對文件命名。
例如:
package ab; class Alpha { private int privateVar; Alpha(int _privateVar){ //構造方法 privateVar = _privateVar; } boolean isEuqualTo(Alpha b) { if (this.privateVar == b.privateVar) return true; else return false; } } public class Beta{ public static void main(String[] args){ Alpha a = new Alpha(1); Alpha b = new Alpha(2); System.out.println(a.isEuqualTo(b)); } }
編譯會產生兩個.class文件,且能正確運行。
其次,這里並沒有要求main函數只能寫在public類中(雖然我們通常是這么做的)。我們可以把main函數寫在非public類中,例如新建test.java:
package exercise; public class test { public static void func(){ System.out.println(1); } } class test2{ public static void main(String[] args){ System.out.println(2); } }
Java里面就是main方法(這個main方法只需要放到任意一個類中即可)。當你用java執行這個類時,系統會尋找main方法作為入口執行。
所以這里test類中的函數根本沒有執行,結果只打印出2。
參考鏈接:
1、https://www.cnblogs.com/zhukunqiang/p/6652787.html