當前位置:編程學習大全網 - 源碼下載 - 壹個java源文件中必須有public類嗎

壹個java源文件中必須有public類嗎

是的,且只能有壹個,解釋如下:

每個編譯單元(文件)只能有壹個public類。這麽做的意思是,每個編

譯單元只能有壹個公開的接口,而這個接口就由其public類來表示。

我想這或是從軟件架構設計和安全性設計上得出的結論。或者說是java的設計者們從這方面的考慮。或許這真的是壹個規範,但我沒有找到相關資料

不曉得到底有沒有這壹說話。如果有請知道的同行給出資料來源?

實驗如下:

Test3.java源文件:

class Test1

{

int i = 1;

}

class Test2

{

int i = 2;

public static void main(String[] args)

{

System.out.println("main method");

}

}

C:/javatest>javac Test3.java

C:/javatest>Java Test2

main method

註:編譯不會出錯,註意是運行的Test2 因為沒有Test3.class文件生成。如果運行Test3則報錯

找不到該類

C:/javatest>java Test3

Exception in thread "main" java.lang.NoClassDefFoundError: Test3

Caused by: java.lang.ClassNotFoundException: Test3

at java.NET.URLClassLoader$1.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.Net.URLClassLoader.findClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

Could not find the main class: Test3. Program will exit.

這個錯誤原因很簡單:JVM中的類加載器找不到Test3.class

同時這裏也說明了包含main()的類如果想運行則不壹定要是public的。

《深入jvm第二版》中有這樣壹句話:

java虛擬機實例通過調用某個類的main()來運行壹個Java程序,而這個main()必須是public

static void 並接收壹個字符串數組作為參數,任何擁有這樣壹個main()的類都可以作為java程

序的起點。

並沒有說擁有main()方法的類壹定要是public類。

Test7.java源文件:

class Test5

{

int i = 1;

}

public class Test6

{

int i = 2;

public static void main(String[] args)

{

System.out.println("main method");

}

}

如果運行Test7.java 報錯:

C:/javatest>javac Test7.java

Test7.java:8: 類 Test6 是公***的,應在名為 Test6.java 的文件中聲明

public class Test6

^1 錯誤

這裏說明了文件名必須與public類的類名壹致,(如果文件中有public類)

這裏可以看出如果有多個public類,那麽文件名應該是哪個public類的呢?顯然壹個java源文件

只能有壹個public類。

所以總結如下:壹個Java源文件中最多只能有壹個public類,當有壹個public類時,源文件名必

須與之壹致,否則無法編譯,如果源文件中沒有壹個public類,則文件名與類中沒有壹致性要求。

至於main()不是必須要放在public類中才能運行程序。

以上是通過實驗得出的結論,個人認為到這裏已經可以了,如果壹定要追問到底,可能要問問java

平臺的設計者了。或許,人家會說:這是java的設計和jvm的內部體系結構設計造成,這是壹個規

範,沒有為什麽。

  • 上一篇:魔獸世界最遠距離視角怎麽弄?
  • 下一篇:足球經理‘FM’和‘CM’哪款遊戲比較好玩?
  • copyright 2024編程學習大全網