一旦代码被编译, 就没有内部类之类的东西 。如果查看的结果
javac,则会看到两个文件:
A.classA$B.class
因此,类
B在加载时
A不会加载,
B只是 碰巧 在中定义了
A。
编辑
例如,鉴于这两个文件,
package kuporific;public class A { private static class B {} private class C {}}和一个
build.gradle文件(为方便起见):
apply plugin: 'java'
首先,通过运行进行构建
gradle build。然后,解压缩生成的JAR文件(位于中
build/libs):
├── meta-INF│ └── MANIFEST.MF└── kuporific ├── A$B.class ├── A$C.class └── A.class
打开每个文件(例如,在IntelliJ中),将显示编译器已完成的操作:
A.class
:
package kuporific; public class A { public A() { } private class C { public C() { } } private static class B { public B() { } } }A$B.class
:
package kuporific; class A$B { private A$B() { } }A$C.class
:
package kuporific; import kuporific.A; class A$C { private A$C(A this$0) { this.this$0 = this$0; } }注意
A$B
没有引用其父项A
,而引用A$C
。这是因为前者是静态内部类,而后者不是,并且- 这两个
A$B
和A$C
现在 包专用 类。
这就是非静态内部类如何直接引用其父实例的字段和方法的方法,反之亦然。(在内部类中引用的父类的任何私有字段也都被设置为私有包。)
接下来,让我们看看加载类
A对
A$B和有什么影响
A$C。
首先,添加以下Java类:
package kuporific;public class Main { public static void main(String[] args) throws ClassNotFoundException { Main.class.getClassLoader().loadClass("kuporific.A"); }}现在将以下内容添加到
build.gradle文件中:
apply plugin: 'application'mainClassName = 'kuporific.Main'applicationDefaultJvmArgs = ["-verbose:class"]
该
-verbose:class输出由JVM加载的所有类(见爪哇-
获取在JVM加载的所有类的列表)。
运行
gradle run命令行(它运行上
main的方法
Main); 输出(加上我的注释)是
:compileJava:processResources UP-TO-DATE:classes:run[Opened /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre/lib/rt.jar][Loaded java.lang.Object from /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre/lib/rt.jar]# Lots of omitted output...[Loaded kuporific.Main from file:/tmp/build/classes/main/] ^ here![Loaded sun.launcher.LauncherHelper$FXHelper from /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre/lib/rt.jar][Loaded java.lang.Class$MethodArray from /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre/lib/rt.jar][Loaded kuporific.A from file:/tmp/build/classes/main/] ^ here![Loaded java.lang.Shutdown from /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre/lib/rt.jar][Loaded java.lang.Shutdown$Lock from /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre/lib/rt.jar]BUILD SUCCESSFULTotal time: 6.502 secs
我们可以看到
kuporific.Main和
kuporific.A的加载时间,也看不到
kuporific.A$B或
kuporific.A$C正在加载。



