import语句仅对编译器很重要.在字节码中,对其他类的所有引用都是完全限定的.这就是为什么超级进口在运行时无关紧要的原因.
在您的情况下,JVM将尝试加载加载和验证A所需的所有类,因此它将尝试立即加载B,但是只有在需要时才会延迟加载依赖类.看看以下示例:
public class A {
public static void bar() {
new B().foo();
}
public static void main(String[] args) {
//bar();
}
}
编译A.java并删除B.class.如果不调用bar()方法,程序就可以正常运行.但是一旦你实际使用B类取消注释代码,你就会变得讨厌:
Exception in thread "main" java.lang.NoClassDefFoundError: B
at A.bar(A.java:4)
at A.main(A.java:8)
Caused by: java.lang.ClassNotFoundException: B
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 2 more
如果B不可用,你将得到NoClassDefFound或类似的.