当一个类实例化以下对象时,内存中会发生什么?
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 分配空间。您通常不知道或不关心 String 实现的内部结构,因此只需相信一块内存用于表示“某些属性值”。此外,您还临时分配了一些内存,其中包含对字符串的引用。在第二种形式中,它被明确地称为tmp
;在你原来的形式中,Java 会处理它而不命名它。
接下来,JVM 为新的 SomeObject 分配空间。这是 Java 内部簿记的一点空间,也是对象每个字段的空间。在这种情况下,只有一个字段,strSomeProperty
.
请记住strSomeProperty
只是对 String 的引用。目前,它将被初始化为 null。
接下来,执行构造函数。
this.strSomeProperty = strSomeProperty;
这一切所做的就是复制参考到字符串,到你的strSomeProperty
field.
最后为对象引用分配空间so1
。这是通过对 SomeObject 的引用来设置的。
so2
以完全相同的方式工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)