微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java实例化

>当一个对象在 Java中实例化时,真正进入内存的是什么?
>是否包含父构造函数的副本?
>为什么隐藏的数据成员在转换时的行为与覆盖方法不同?

我理解通常给出的正确的使用这些东西的抽象解释,但JVM如何真正做到这一点.

解决方法

一个对象被实例化时,只有非静态数据实际上是“创建”,以及对创建它的对象类型的引用.

没有一种方法被复制.

创建它的类的“引用”实际上是一个指针分派表.存在针对该类可用的每种方法一个指针.指针总是指向方法的“正确”(通常是对象树中最低/最特定的).

这样,如果你有一个顶级的调用一个方法,但另一个方法已被覆盖,被覆盖的方法将被调用,因为这是表中的指针指向.由于这种机制,调用覆盖方法比顶级方法不应该花更多的时间.

指针表成员变量是类的“实例”.

可变问题与完全不同的机制“名称空间”有关.变量不是“Subclassed”(它们不进入dispatch表),但是public或protected变量可以被局部变量隐藏.这在编译时都由编译器完成,与运行时对象实例无关.编译器确定您真正想要的对象,并将其引用到代码中.

范围界定规则通常倾向于“最近的”变量.任何远离同一个名字的东西都将被忽略(阴影),有利于更接近的定义.

如果您有兴趣,要更多地了解内存分配:所有“OBJECTS”都分配在“堆”(实际上比真正的堆,但是相同的概念更令人高兴和美丽)变量总是指针 – Java将永远不会复制一个对象,你总是将一个指针复制到该对象.方法参数和局部变量的变量指针分配在堆栈上完成,但即使在堆栈上创建变量(指针),它们仍然从未在堆栈上分配它们指向的对象.

我很想写一个例子,但这已经太长了.如果你希望我用扩展关系输出几个类,并且他们的方法和数据如何影响代码生成,我可以…只是问.

原文地址:https://www.jb51.cc/java/125159.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐