陷阱 - 宣告與標準類名稱相同的類
有時,不熟悉 Java 的程式設計師錯誤地定義了一個名稱與廣泛使用的類相同的類。例如:
package com.example;
/**
* My string utilities
*/
public class String {
....
}
然後他們想知道為什麼他們會出現意外錯例如:
package com.example;
public class Test {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
如果你編譯然後嘗試執行上面的類,你將收到一個錯誤:
$ javac com/example/*.java
$ java com.example.Test
Error: Main method not found in class test.Test, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
有人看著 Test
類的程式碼會看到 main
的宣告並檢視它的簽名並想知道 java
命令在抱怨什麼。但實際上,java
命令說實話。
當我們在與 Test
相同的包中宣告 String
的版本時,此版本優先於 java.lang.String
的自動匯入。因此,Test.main
方法的簽名實際上是
void main(com.example.String[] args)
代替
void main(java.lang.String[] args)
和 java
命令將不識別該作為入口點的方法。
類:不要定義與 java.lang
中的現有類同名的類,或 Java SE 庫中的其他常用類。如果你這樣做,你就會為各種晦澀的錯誤做好準備。