淺談為什么一個java源文件中只能有一個public類?


聲明,本篇文章為轉載

轉載

http://blog.csdn.net/bareheadzzq/article/details/6562211

最近在一個java文件中實現了幾個類,其中一個聲明為public類型,但編譯器報錯;后來將public去掉,也即文件中沒有一個public類,程序正常運行,有些困惑,最后通過本文章找到答案,為以后方便查找,轉載,感謝作者。

結論:

一個Java源文件中最多只能有一個public類,當有一個public類時,源文件名必

須與之一致,否則無法編譯,如果源文件中沒有一個public類,則文件名與類中沒有一致性要求。
至於main()不是必須要放在public類中才能運行程序。

 

轉載內容:

閑着沒事,在網上看到一個帖子在問為什么一個java源文件中只能有一個public類?
網上有人這么回答:http://topic.csdn.net/t/20060528/22/4784755.html
、每個編譯單元(文件)只能有一個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的內部體系結構設計造成,這是一個規

范,沒有為什么。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM