字符串类造成混淆

2022-09-03 04:31:14

最近我刚刚在java中遇到一个错误

Exception in thread "main" java.lang.NoSuchMethodError: main

即使我的班级只有3行代码。

public class Test{
    public static void main(String[] args){
    System.out.println("hello");
    }
}

我想知道为什么会发生这种情况,但后来我知道有一个公共类String,我尝试并在同一包中创建。

所以现在出现了新的问题是在这种情况下会发生什么,尽管String不是在java中定义的(你可以在你的代码中使用)keyword

然后我刚刚从包中删除了String.java &String.class文件,但听起来很奇怪,你不能使用String类。

问:Java 是否优先考虑我们的自定义类?


答案 1

您的主要方法需要匹配

 public static void main(java.lang.String[] args){ ... }

如果在具有 main 方法的类所在的同一包中创建自己的类,则该类将变为String

 public static void main(your.own.package.String[] args){ ... }

这是有效的,但不允许运行时启动器再找到一个main方法,因为它期望作为参数。java.lang.String[]

默认情况下,from 的类是自动导入的,因此您不需要显式语句 - 这可能会让您更加困惑。java.langimport

根据经验,我会尽可能避免将我自己的类命名为与 Java 运行时中的类相同的名称 - 尤其是来自 .java.lang

另请参阅 JLS:第 7 章。套餐

一个包由许多编译单元组成 (§7.3)。编译单元自动访问其包中声明的所有类型,并自动导入在预定义包 java.lang 中声明的所有公共类型


答案 2

您始终可以使用完全限定的名称:

public static void main(java.lang.String[] args) ...

您正在讲述的故事说,我们可以将其用作其中一个类的名称。但是,就像在现实生活中一样,如果有两个名叫“约翰”的人,你有时需要消除他们的歧义。String