①test.java下public class classA
public class classA{ public static void main(String[] args){ System.out.println("public classA main..."); } }
②test.java下public class classA + class test
public class classA{ public static void main(String[] args){ System.out.println("public classA main..."); } } class test{ public static void main(String[] args){ System.out.println("class test main..."); } }
③test.java下public class classA + public class test
public class test{ public static void main(String[] args){ System.out.println("public classA main..."); } } public class classA{ public static void main(String[] args){ System.out.println("class test main..."); } }
④test.java 下 class classA, class classB
class classA{ public static void main(String[] args){ System.out.println("classA main..."); } } class classB{ public static void main(String[] args){ System.out.println("classB main..."); } }
⑤test.java 下 class test, class classB
class test{ public static void main(String[] args){ System.out.println("test main..."); } } class classB{ public static void main(String[] args){ System.out.println("classB main..."); } }
現象:只要代碼中有public類就必須和文件名一致,否則編譯報錯,但是沒有public類則文件名和類名無所謂。
規定:編譯器決定
(《java編程思想》):當編寫一個java源代碼文件時,此文件通常被稱為編譯單元(有時也被稱為轉譯單元),每個編譯單元都必須有一個后綴名.java,而在編譯單元內則可以有一個public類,該類的名稱必須與文件的名稱相同(包括大小寫,但不包括文件的后綴名.java)。每個編譯單元只能有一個public類,否則編譯器就不會接受。如果在該編譯單元之中還有額外的類的話,那么在包之外的世界是無法看見這些類的,這是因為它們不是public類,而且它們主要用來為主public類提供支持。
每個編譯單元(文件)只能有一個public類,意思是,每個編譯單元只能有一個公開接口,而這個接口就由其public類來表示。(軟件架構設計和安全性設計上得出的結論,或者說java的設計者們從這方面的考慮,或者真是一個規范?)
(參考:www.cnblogs.com/fuhongliang/p/4304477.html)
優點:
(1)防止.class文件覆蓋,A.java下public class B若不記住這種關系,則可能再寫出B.java下public class B,編譯后只會留有一份B.class
(2)被項目中其他任何類引用時,只需在使用它前import所對應的class文件即可,將類名與文件名一一對應就可以方便虛擬機在相應的路徑(包中)中找到相應的類的信息,否則很難找到需要的類,開銷也很大。