在一次采访中,有人问我为什么 java 中的对象是动态创建的?
我无法理解这个问题,任何人都可以解释一下吗?
该人可能指的是 Java 不像 C++ 那样知道堆栈上的隐式对象创建这一事实。
std::string string;
在 C++ 中的堆栈上创建一个对象,同时
String string;
只是在 Java 中创建一个引用,但没有创建对象(也没有调用构造函数)。
如果您对该主题感兴趣,我建议您阅读有关 Java 内存模型的更多信息。
在我看来,这个问题询问为什么 Java 中的对象仅使用动态分配的内存(使用new
关键字)创建,而不是使用静态分配的内存创建(例如在 C++ 中)。如果(这是一个很大的如果)这就是问题的意思,那么您可以回答一些问题。
在回答之前,必须注意问题的前提并不完全正确(您甚至可以说它是错误的)。Java 对象不是严格动态创建的。如果转义分析可以证明引用没有转义给定范围,则可以对其进行编译以使其使用静态分配。
鉴于上述情况,一个可能的答案是抽象。堆栈和堆(传统上分别与静态和动态内存相关联)实际上是实现细节(即使我们已经习惯了它们)。Java 试图隐藏这一点,因此它不会给你提供静态或动态内存之类的术语来使用——它甚至不给你内存,它给你对象。
另一个答案(同样,给出注释)是对象在现实世界中的使用。很多时候,在现实世界的场景中,对象确实需要脱离其初始范围,使动态分配成为唯一有效的候选对象。
如果你从字面上看这个问题,我会说:
因此,您不必一次加载所有内容(在 init fase 上)并将其保存在内存中直到应用程序/程序结束。这为您提供了更有效的内存使用。
;-)
一个非常开放的问题,需要一些背景才能给出一个好的答案。
它不是特定于 Java 的,而是针对所有编程语言的。每个对象都可以是动态的,就像为对象分配的内存是在运行时从执行平台上可用的资源中分配的。甚至常量、静态类和类似的概念也仅在文件实际执行时才使用内存。
静态对象可能存在于某些硬件硬编码值中,例如 BIOS 或 TPL 模块的某些部分。此值是只读的 - 没有已知的方法可以更改对象的值。
但是,这只是一个答案,取决于我认为动态的含义。这是主观的,不同的人可能会想出其他有效的答案。除非给出一些额外的背景,否则这不是面试的好问题。