当类实例化以下对象时,内存中会发生什么?
public class SomeObject{
private String strSomeProperty;
public SomeObject(String strSomeProperty){
this.strSomeProperty = strSomeProperty;
}
public void setSomeProperty(String strSomeProperty){
this.strSomeProperty = strSomeProperty;
}
public String getSomeProperty(){
return this.strSomeProperty;
}
}
在类SomeClass1
:
SomeObject so1 = new SomeObject("some property value");
在类SomeClass2
:
SomeObject so2 = new SomeObject("another property value");
如何为新实例化的对象及其属性分配内存?
最佳答案
让我们一步一步来:
SomeObject so1 = new SomeObject("some property value");
... 实际上比看起来更复杂,因为您正在创建一个新字符串。可能更容易理解为:
String tmp = new String("some property value");
SomeObject so1 = new SomeObject(tmp);
// Not that you would normally write it in this way.
(绝对准确 - 这些并不完全等效。在原始版本中,“新字符串”是在编译时创建的,并且是 .class 图像的一部分。您可以将其视为性能黑客。)
所以,首先 JVM 为字符串分配空间。您通常不知道或不关心 String 实现的内部结构,因此请相信一 block 内存正在用于表示“某些属性值”。此外,您还临时分配了一些内存,其中包含对字符串的引用。在第二种形式中,它被显式称为 tmp
;以您的原始形式,Java 处理它而不命名它。
接下来,JVM 为新的 SomeObject 分配空间。这是 Java 内部簿记的一点空间,也是每个对象字段的空间。在这种情况下,只有一个字段,strSomeProperty
。
请记住,strSomeProperty
只是对字符串的引用。目前,它将被初始化为 null。
接下来,构造函数被执行。
this.strSomeProperty = strSomeProperty;
所有这一切就是将 reference 复制到字符串中,复制到您的 strSomeProperty
字段中。
最后,为对象引用so1
分配空间。这是通过对 SomeObject 的引用设置的。
so2
的工作方式完全相同。
关于java - Java 对象的内存分配过程中的步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/320980/