陷阱 - 声明与标准类名称相同的类

有时,不熟悉 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 库中的其他常用类。如果你这样做,你就会为各种晦涩的错误做好准备。