陷阱 - 宣告與標準類名稱相同的類

有時,不熟悉 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 庫中的其他常用類。如果你這樣做,你就會為各種晦澀的錯誤做好準備。