只是想了解为什么我能够创建String.java文件,并且编译时没有任何错误。据我所知,类加载器链将转到Bootstrap类加载器,它已经加载了Sting.class。您能帮助我了解吗?
String.java
2fjabf4q1#
一个类不是仅通过它的名称来标识的,而是通过它的全限定名称来标识的,全限定名称是包的名称,后跟类名。如果你在某个包com.myapp中创建了你自己的String类,那么它的全限定名将是com.myapp.String。它与标准的String类并不冲突,后者的全限定名是java.lang.String。当然,这样做会很混乱,特别是因为包java.lang中的类是默认导入的,因此,在实践中,你不应该编写自己的类String,或者将自己的任何类命名为与标准库中的类相同的类(尤其是包java.lang中的标准类)。
com.myapp
String
com.myapp.String
java.lang.String
java.lang
pu3pd22g2#
正如Jesper所强调的,类的唯一性是由它的完全限定名(即package)决定的。尝试将这两个String类导入到另一个类中,当您尝试使用它时,您将观察到差异。
import java.lang.String; import com.myclass.String;
现在,为了解决这种歧义,您需要通过类的完全限定名来引用该类。
2条答案
按热度按时间2fjabf4q1#
一个类不是仅通过它的名称来标识的,而是通过它的全限定名称来标识的,全限定名称是包的名称,后跟类名。
如果你在某个包
com.myapp
中创建了你自己的String
类,那么它的全限定名将是com.myapp.String
。它与标准的String
类并不冲突,后者的全限定名是java.lang.String
。当然,这样做会很混乱,特别是因为包
java.lang
中的类是默认导入的,因此,在实践中,你不应该编写自己的类String
,或者将自己的任何类命名为与标准库中的类相同的类(尤其是包java.lang
中的标准类)。pu3pd22g2#
正如Jesper所强调的,类的唯一性是由它的完全限定名(即package)决定的。
尝试将这两个String类导入到另一个类中,当您尝试使用它时,您将观察到差异。
现在,为了解决这种歧义,您需要通过类的完全限定名来引用该类。