我理解通常为让您正确使用这些东西而给出的抽象解释,但是JVM实际上是如何做到的。
发布于 2008-10-20 22:47:20
当一个对象被实例化时,实际上只有非静态数据被“创建”,同时引用创建它的对象类型。
所有的方法都不会被复制。
对创建它的类的“引用”实际上是一个指针调度表。类可用的每个方法都有一个指针。指针总是指向方法的“正确”(通常是对象树中最低/最特定的)实现。
这样,如果您有对另一个方法的顶级调用,但另一个方法已被重写,则将调用重写的方法,因为这是表中指针指向的位置。由于这种机制,调用覆盖的方法不应该比调用顶层的方法花费更多的时间。
指针表+成员变量是类的“实例”。
变量问题与一个完全不同的机制“名称空间”有关。变量根本不是“子类”(它们不进入调度表),但是公共或受保护的变量可以被局部变量隐藏。这都是编译器在编译时完成的,与运行时对象实例无关。编译器确定您真正想要的对象,并将对此的引用填充到代码中。
作用域规则通常是为了支持“最近的”变量。任何使用相同名称的更远的地方都将被忽略(阴影),以支持更接近的定义。
如果您感兴趣的话,可以更具体地了解内存分配:所有“对象”都在“堆”上分配(实际上比真正的堆更高效、更漂亮,但概念相同)。变量总是指针--Java永远不会复制对象,而您总是复制指向该对象的指针。方法参数和局部变量的变量指针分配是在堆栈上完成的,但是即使变量(指针)是在堆栈上创建的,它们指向的对象仍然没有在堆栈上分配。
我很想写一个例子,但这已经太长了。如果您希望我键入几个具有扩展关系的类,以及它们的方法和数据如何影响生成的代码,我可以.问问就行了。
发布于 2008-10-20 22:23:43
我想你会发现这是一个全面的例子:
http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html
发布于 2014-08-25 10:04:03
https://stackoverflow.com/questions/220133
复制相似问题