- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设我有一个类A.java
,
当我执行 A 的构造方法时,它会为 xyz
对象创建一个内存空间。
A xyz = new A();
对内存的引用可能是这样的,
[xyz] ---> '0x34524'
这就是 OOP 的基础知识。很简单!
如果一个类继承自不同的父类会怎样?将在内存中创建多少对象空间?
假设我们有,
然后我们创建一个D.java
类的对象,
D omg = new D();
这里我们知道D的对象会调用C.java的construct等等,直到A.java。这是否意味着在内存中我们有 4 个不同的内存引用,因为我们正在实例化所有四个对象(一个直接实例化,另一个 3 个间接实例化)?
[omg] ---> '0x34525'
[C] ---> '0x34526'
[B] ---> '0x34527'
[A] ---> '0x34528'
注意:
new
关键字时创建其他内部对象。 最佳答案
首先,有点……调用对象的构造函数并不会分配它。在字节码中,初始化 new Object()
被表达为某种效果...
new java/lang/Object
invokespecial java/lang/Object <init>()V
new
指令负责分配空间并获取对尚未初始化的对象的引用,而 invokespecial
处理调用构造函数本身(它在内部编译为 void
method named <init>
,因此是 descriptor <init>()V
)。
继续,对象分配的内部结构和 representation on the heap are entirely JVM specific .然而,据我所知,每个分配的对象只有 一个 分配的对象,无论其父类(super class)的数量如何。内存中的对象本身为其自身类及其父类(super class)的实例字段提供空间。它还必须有空间用于 virtual method table ,以便在为对象执行虚拟方法调用(例如通过 invokevirtual
)时进行虚拟分派(dispatch)。
在内部,Oracle HotSpot JVM 管理称为oops 或普通对象指针的东西。您可以阅读有关 HotSpot 内存布局的更多信息 here .欢迎调用browse the HotSpot source repository .
关于java - 继承和对象创建,理论上和实际,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11837158/
只是要清楚我没有一个具体的例子,因为使用的方式 到目前为止,建议使用各种“如何”来实现适合我的需求,并且我还没有遇到关于锁的任何问题,但是在python中使用锁确实引发了以下问题 似乎调用lock.a
这是一个理论问题;作为一名计算机科学爱好者,我一直在思考这个问题,并且正在尝试理解可能(或正在)用于解决这个问题的逻辑和方法。 问题:假设您有一个数字空间可以在其中漫游以获取某种 ID 值。您需要在此
查看这段代码: public async Task ConsumeAsync() { await a(); await b(); a
以下产生死锁错误消息(* 异常:线程在 MVar 操作中无限期阻塞)。我一步一步想通了,没看出问题。 在主线程上,创建一个 MVar,并将其提供给生产者,在新线程上运行 生产者启动,并在 listen
我想嵌入 3 个 NP-Complete 问题(其中 2 个已知是 NP-Complete,其中 1 个是我自己的想法)。我看到了“this question”并得到了关于从理论上重新解释嵌入问题的想
我刚刚测试了这段代码。 主要。 public class Main { /** * @param args */ public static void main(S
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我目前正在研究 open-std proposal为我正在处理的项目带来并行功能,但我遇到了 find_end 的障碍。 现在find_end可以描述为: An algorithm that sear
我正在编写看起来与此类似的代码: public IEnumerable Unfold(this T seed) { while (true) { yield retur
给定以下函数调用: f(g(), h()) 由于未指定函数参数的评估顺序(据我所知,在 C++11 中仍然如此),理论上是否可以执行 g() 和 h() 并行? 这种并行化只能在 g 和 h 已知相当
我在 C 中有两个项目: 第一个: include windows.h include stdio.h include tchar.h int main() { HANDLE hFile =
我在碰撞检测中有一个关于类似问题的问题,但它并不完全相同。我遇到了一个新游戏项目的问题(我正在尝试了解有关 HTML5 Canvases 和 Socket.io 的更多信息),其中我的碰撞不起作用。我
这个问题在这里已经有了答案: Why `alert()` after `setTimeout()` is not called as expected? (1 个回答) 关闭 8 年前。 为什么 s
在某些情况下,需要一种高效的内存来存储大量对象。要在 Java 中做到这一点,您不得不使用几个原始数组(请参阅下面的原因)或一个大字节数组,这会产生一些 CPU 开销以进行转换。 例子:你有一个 cl
我熟悉 PHP 函数如何映射到 PHP 下面的 C 代码中的 C 函数。我知道 C 中函数的含义以及 MACRO() 的含义。 我不明白什么是语言构造,例如 echo,在 PHP 中是什么意思。 最佳
刚刚将 libevent(1.4.8)、memcached(1.4.5)、pear 和 libmemcached(0.40) 安装到我的 lamp 服务器(运行 PHP 5.2.10 和 Centos
当谈到扩展方法时,类名似乎什么都不做,但提供了一个分组,这正是 namespace 所做的。一旦包含命名空间,我就会在命名空间中获得所有扩展方法。所以我的问题归结为:我可以从静态类中的扩展方法中获得一
我在我拥有的存储库(实际上是 fork 的)上使用 VS2015 GitHub 扩展。在 .gitignore 文件中的某些时候我有这个(从 fork 中获取,我没有添加 ignore ): ...
大家好。我会尽力解释我的问题,以便您能理解我。 在几个地方我发现它认为 Scala 比 Python 更快: https://www.quora.com/Which-one-is-faster-Sca
我是一名优秀的程序员,十分优秀!