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