运行此代码:
class A {
public int x;
public A() {
function();
}
public void function() {
this.x = 20;
}
public void printhey() { System.out.println("Hey"); }
}
class B extends A {
public B() {
super();
printhey();
}
public void function() {
this.x = 50;
}
}
public class tmp {
public static void main(String[] args) {
System.out.println((new B()).x);
}
}
Run Code Online (Sandbox Code Playgroud)
打印出来:
Hey
50
Run Code Online (Sandbox Code Playgroud)
谁设置了VTBL?在A的构造函数中,function已经设置为B.但是在B构造函数中,printhey被设置为A的.
小智 6
"VTBL"是存储结构中处理的语言工件.也就是说,在C++中,您可以准确地推断出类在RAM中的映射方式.
Java不涉及存储结构,它处理数据结构.您可以轻松地将存储结构用作数据结构,但反过来并不是那么简单.如果您在1991年初碰巧收到了BYTE杂志的副本,您甚至可以找到我赞美将C++数据结构映射到Commodore Amiga OS ROM内核(Exec)使用的存储结构的优点的文章.事实上,在那时,"数据结构"这个术语被用作一种包罗万象的东西,因为我们仍然担心事物如何恰好适合记忆.
数据结构通常由算法使用.存储结构与内部实现和序列化表单更紧密相关.实际的程序执行需要两者兼而有之,但Java数据结构底层的存储结构应该是不透明的.这是Java"Write Once,Run Anywhere"的重要组成部分.如果您不必担心事物的大小和字节方向,则不必使用"swabbers"和内存偏移计算器来加载应用程序.
有些编程语言不喜欢前向和循环引用.没有它们,Java很难做到.但是,对代码的硬引用和对字节码绑定的方法签名的引用之间存在差异,并且(可能)最终将JIT编译为机器代码.甚至在一些更先进的JVMS中重新优化和重新编译.这一切归结为实际上,你有多次通过类,其中一个建立字典,另一个插入链接.如果合适,包括自动内联.