首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java实例化

Java实例化
EN

Stack Overflow用户
提问于 2008-10-20 22:13:20
回答 3查看 3.7K关注 0票数 10
  1. When对象在Java中实例化,包含的父构造函数的memory?
  2. Are副本中到底包含了什么?
  3. 为什么隐藏数据成员在转换时的行为与重写的方法不同?

我理解通常为让您正确使用这些东西而给出的抽象解释,但是JVM实际上是如何做到的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-10-20 22:47:20

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

所有的方法都不会被复制。

对创建它的类的“引用”实际上是一个指针调度表。类可用的每个方法都有一个指针。指针总是指向方法的“正确”(通常是对象树中最低/最特定的)实现。

这样,如果您有对另一个方法的顶级调用,但另一个方法已被重写,则将调用重写的方法,因为这是表中指针指向的位置。由于这种机制,调用覆盖的方法不应该比调用顶层的方法花费更多的时间。

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

变量问题与一个完全不同的机制“名称空间”有关。变量根本不是“子类”(它们不进入调度表),但是公共或受保护的变量可以被局部变量隐藏。这都是编译器在编译时完成的,与运行时对象实例无关。编译器确定您真正想要的对象,并将对此的引用填充到代码中。

作用域规则通常是为了支持“最近的”变量。任何使用相同名称的更远的地方都将被忽略(阴影),以支持更接近的定义。

如果您感兴趣的话,可以更具体地了解内存分配:所有“对象”都在“堆”上分配(实际上比真正的堆更高效、更漂亮,但概念相同)。变量总是指针--Java永远不会复制对象,而您总是复制指向该对象的指针。方法参数和局部变量的变量指针分配是在堆栈上完成的,但是即使变量(指针)是在堆栈上创建的,它们指向的对象仍然没有在堆栈上分配。

我很想写一个例子,但这已经太长了。如果您希望我键入几个具有扩展关系的类,以及它们的方法和数据如何影响生成的代码,我可以.问问就行了。

票数 17
EN

Stack Overflow用户

发布于 2008-10-20 22:23:43

我想你会发现这是一个全面的例子:

http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html

票数 2
EN

Stack Overflow用户

发布于 2014-08-25 10:04:03

  1. 内存从堆中分配,以保存对象及其超类的所有实例变量和特定于实现的数据。特定于实现的数据包括指向类和方法数据的指针。
  2. 对象的实例变量被初始化为其默认值。调用大多数派生类的构造函数
  3. 。构造函数所做的第一件事是为其uppercase.This进程调用构造函数,直到调用java.lang.Object的构造函数为止,因为java.lang.Object是java中所有对象的基类。在执行构造函数主体之前,
  4. 将执行所有实例变量初始化器和初始化块。然后执行构造函数的主体。因此,基类的构造函数首先完成,大多数派生类的构造函数最后完成。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/220133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档