【发布时间】: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