案例1:我定义了一个包,java.lang,并在这个包中定义了一个类字符串:
package java.lang;
public class String {
String name = "ABC";
}在这里,我可以将自定义字符串类的引用(名称)分配给来自核心java库的String类的对象(“ABC”)。为什么编译器允许这样做?
案例2:当我在其他包中定义相同的字符串类时,比如java.langplus:
package java.langplus;
public class String {
String name = "ABC"; //compiler error
}然后,这一行String name = "ABC";会像预期的那样抛出编译器错误,因为我将自定义字符串类的引用从java.langplus类分配给核心字符串类的对象。
发布于 2016-11-09 08:00:28
在运行时,java中的每个类都是由其类加载器加上其包定义的。
在编译时,我们没有类加载器,因此编译器只使用包名进行类型检查,以进行引用分配。
在案例2中,对于核心字符串:"ABC“和字符串引用: name,包名与java.langplus包不同。
在第1种情况中,即使编译器在 java.lang中找到与"ABC“类(即核心库字符串类)相同的字符串类,但它在运行时将失败。
https://stackoverflow.com/questions/40501853
复制相似问题