【问题标题】:String class make confusion字符串类制造混乱
【发布时间】:2014-02-23 22:29:38
【问题描述】:

最近我在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 是否优先考虑我们的自定义类?

【问题讨论】:

  • 我真的不明白你在做什么

标签: java string keyword


【解决方案1】:

你的main方法需要匹配

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

如果你创建你自己的String类在你的main方法所在的同一个包中,它会变成

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

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

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

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

另见JLS: Chapter 7. Packages

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

【讨论】:

  • 但这意味着如果我写 String[] 那意味着我的自定义课程?真的是这个意思吗?
  • 如果您编写 String[],编译器会查看导入以检查是否存在 String 的导入。由于您的其他类 String 位于默认情况下导入的同一包中。
  • 对此有任何参考吗?我并不认为这是错误的,但默认情况下会导入java.lang(如答案中所写)......并且JRE jars首先在类路径AFAIK......
  • 我又做了一个测试,不确定是否足够,在另一个包中包含 String 并使用 import another.package.* 并且来自同一个包的那个仍然具有优先权。当 String 仅在另一个包中(不在同一个包中)并且它作为 another.package.* 导入时,我遇到了模棱两可的错误...
  • @Betlista 有趣的是,当前包中的类型似乎总是优先于任何导入的类型 - 然后编译器不会发出任何错误......我已经发布了后续问题:stackoverflow.com/questions/21477783/…
【解决方案2】:

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

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

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

【讨论】:

  • 当然可以有......像风筝(鸟,纸的东西。)
猜你喜欢
  • 1970-01-01
  • 2017-04-06
  • 2011-04-22
  • 2020-06-28
  • 2014-10-03
  • 2015-07-26
  • 1970-01-01
  • 2018-08-11
  • 2014-01-26
相关资源
最近更新 更多