【问题标题】:why is it possible to create String.java?为什么可以创建 String.java?
【发布时间】:2022-01-07 10:16:43
【问题描述】:

只是想了解为什么我能够创建String.java 文件并且编译它没有任何错误。据我所知,类加载器链将转到 Bootstrap 类加载器,它已经加载了 Sting.class。 你能帮我理解一下吗?

【问题讨论】:

  • 你可能没有在 java.lang 包中创建它。
  • 它甚至与内置类冲突吗? “原始”Stringjava.lang.String
  • 你觉得这样不好?我曾经参与过一个项目,他们创建了自己的 Object 和 String 类...
  • 编译源代码时,类加载器链是完全不相关的。在源代码级别没有类加载器之类的东西。虽然您实际上并没有为 java.lang.String 创建源代码,但这样做是有可能的。最后,Java 作者必须这样做,才能创建您正在使用的标准字符串类。

标签: java jvm classloader


【解决方案1】:

一个类不仅仅通过它的名称来识别,而是通过它的完全限定名称来识别,即包的名称后跟类的名称。

如果您在某个包com.myapp 中创建自己的String 类,那么它的完全限定名称将是com.myapp.String。它与标准的String 类不冲突,后者具有完全限定的名称java.lang.String

当然,这样做会很混乱,特别是因为包java.lang 中的类是默认导入的。因此,在实践中,您永远不应该编写自己的类String,或将您自己的任何类命名为与标准库中的类相同(尤其是包中的标准类java.lang)。

【讨论】:

    【解决方案2】:

    正如 Jesper 所强调的,一个类的唯一性取决于它的完全限定名,即 package..

    尝试在另一个类中导入这两个 String 类,你会在尝试使用它时观察到差异。

    import java.lang.String;
    import com.myclass.String;
    

    现在,为了解决歧义,您需要通过其完全限定名称来引用一个类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 2012-03-11
      • 2013-03-31
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多