为什么将核心字符串对象分配给自定义字符串类参考

时间:2016-11-09 07:24:35

标签: java string object jvm package

案例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";抛出编译器错误,因为我将java.langplus类的My custom String类的引用分配给核心String类的Object。

1 个答案:

答案 0 :(得分:3)

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

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

对于案例2,核心字符串的包名称不同:“ABC”和字符串引用: name ,来自java.langplus包。

在案例1中,即使编译器在 您的 java.lang中找到 您的 String类, “ABC”类即核心库String类,它将在运行时失败。