案例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。
答案 0 :(得分:3)
在运行时,java中的每个类都由其类加载器及其包定义。
在编译时我们没有类加载器,因此编译器只使用包名称进行类型检查,以进行引用分配。
对于案例2,核心字符串的包名称不同:“ABC”和字符串引用: name ,来自java.langplus包。
在案例1中,即使编译器在 您的 java.lang中找到 您的 String类, “ABC”类即核心库String类,它将在运行时失败。