Java实例化

前端之家收集整理的这篇文章主要介绍了Java实例化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
>当一个对象在 Java中实例化时,真正进入内存的是什么?
>是否包含父构造函数的副本?
>为什么隐藏的数据成员在转换时的行为与覆盖方法不同?

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

解决方法

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

没有一种方法被复制.

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

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

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

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

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

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

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

原文链接:https://www.f2er.com/java/125159.html

猜你在找的Java相关文章