当我创建自己的String类时。如果同一个包中有另一个类,main( String [] args)似乎选择我的String类而不是rt.jar中的类。我的问题是,为什么在这种情况下,Bootstrap类加载器不会选择rt.jar中的String类。我的理解是一个类加载请求来到Application loader将被委托给bootstrap类加载器。
答案 0 :(得分:8)
因为本地包中的String
优先;您可以明确使用java.lang.String
或将您的class String
命名为 1 。
public static void main(java.lang.String[] args)
为了扩展上述内容,编译时编译器将类名解析为完全限定的形式(在字节码级别,没有任何import
)。此外,Java包含一个String
实习池,它在您的类加载之前被初始化(为了使其正常运行,必须在任何用户类之前加载java.lang.String
)。
1 这是一个更好的主意,来自java.lang
的{{3}}类要求维护噩梦。
答案 1 :(得分:4)
为什么在这种情况下,引导类加载器不会选择来自rt.jar的String类。我的理解是一个类加载请求来到Application loader将被委托给bootstrap类加载器。
名称解析实际上发生在编译时。编译器决定String
在使用它的源代码文件的上下文中的含义,然后在类文件中使用已解析类的全名(例如java.lang.String
或your.pkg.String
) 。在运行时,Java类加载器总是使用完整的类名加载类。