子类不维护任何表示其父类的特殊字段。您可能正在按照内部类的思路进行思考,这些内部类 确实
引用了它们的外部类。这是一种特殊情况,并不代表超子类之间的相互关系。
JVM在内部维护一个“方法表”,将其加载的每个类与该类可用的方法相关联。JVM还知道其加载的所有类之间的关系,包括超级子关系。
当您调用一个
super函数时,JVM实际上会做两件事:
- 确定从中调用该方法的类的父级
- 确定将在父级上调用的方法
- 调用方法,并带有特殊说明(
invokespecial
)
如果要检查类的类文件
Sub,则该
foo方法将显示以下内容:
void foo(); flags: Code: stack=2, locals=1, args_size=1 0: aload_0 1: invokespecial #2 // Method Super.foo:()V 4: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream; 7: ldc#4 // String Sub 9: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
清单1中的第1行显示了调用超类方法的特殊指令。
Java虚拟机规范(尤其是第2.11.8节)是很好的阅读资料。



