【问题标题】:Why Core String Object Assigned to Custom String Class Reference为什么将核心字符串对象分配给自定义字符串类参考
【发布时间】:2016-11-09 07:24:35
【问题描述】:

案例 1: 我已经定义了一个包 java.lang 并在这个包中定义了一个类 String:

package java.lang;
public class String {
    String name = "ABC";
}

在这里,我可以将自定义 String 类的引用(名称)分配给核心 java 库中 String 类的对象(“ABC”)。 为什么编译器允许这样做?

案例 2: 当我在其他一些包中定义相同的 String 类时说 java.langplus:

package java.langplus;
public class String {
    String name = "ABC"; //compiler error
}

那么String name = "ABC"; 行会如预期的那样引发编译器错误,因为我将我的自定义 String 类的引用从 java.langplus 类分配给核心 String 类的 Object。

【问题讨论】:

  • 我看不出编译器如何区分自定义类和核心类,因为它们具有相同的完整限定名。
  • 对它们中的任何一个使用完全限定的类名。
  • 我猜 (1) 与引导“真实”String 类的需要有关,以便在加载String 类所需的类中定义事物,所以编译器会特别对待它。很有趣。
  • 没有“自定义字符串类”。当您在包java.lang 中声明一个类String 时,即为java.lang.String,无需任何讨论。包区分名为String 的不同类的机制。范围内不能有两个名为 java.lang.String 的不同类。

标签: java string object jvm package


【解决方案1】:

在运行时,java 中的每个类都由它的类加载器加上它的包来定义。

在编译时我们没有类加载器,所以编译器只使用包名进行类型检查,用于引用分配。

在情况2的情况下,核心字符串的包名称不同:“ABC”和字符串引用:name,来自java.langplus包。

在情况 1 中,即使编译器在 your java.lang 中发现 your String 类与“ABC”的类,即核心库String类,它会在运行时失败。

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2019-06-19
    相关资源
    最近更新 更多