Java对象创建全解析:从内存分配到多种创建方式详解
一个Java对象创建的全过程详解
在Java编程中,创建对象通常只需要“new”关键字,但也有一些例外,例如对象复制和反序列化过程。首先,当虚拟机遇到新指令时,它会检查类符号引用是否已被加载、解析和初始化。
如果没有完成,则会启动相应的类加载过程。
一旦类被加载,就确定了对象所需的内存大小,然后进行内存分配。
根据虚拟机使用的垃圾收集机制,可以直接分配或通过空间压缩和排序来分配。
内存分配过程必须保证并发安全。
一旦分配了内存,所有区域(除了对象头)都将被初始化为零。
然后对象头会被初始化,包括类信息、元数据引用、哈希码等。
new语句之后,将执行对象的构造函数来完成初始化过程。
初始化一个类涉及几个步骤,其中内存分配是这里关注的中心。
在JDK1.8中,StringTable(存储字符串池)存储在堆内存中,可以通过调整-XX:StringTableSize参数来改变桶的数量。
为了避免重复创建相同的字符串,例如用户的省份,可以使用String类的intern()方法。
JAVA创建对象有哪几种方式???
JAVA中创建对象的四种方法:显式创建对象有四种方法:
1.使用new语句创建对象,这是创建对象最常用的方法。
2.使用反射调用类Java.lang.Class或java.lang.reflect.Constructor的newInstance()实例方法。
3.调用对象的clone()方法。
4.使用反序列化的方式调用java.io.ObjectInputStream对象的readObject()方法。
下面介绍使用前面三种方法创建对象的过程。
上述程序的打印结果如下:
callSecondconstructor
calldefaultconstructor
c1:name=unknown,age=0
调用第二个构造函数
c2:name=Tom,age=20
c2==c3:false
c2.equals(c3):true
c3:name=Tom,age=20
从上面的打印结果可以看出、使用new当使用类对象的语句或者newInstance()方法创建Client对象时,Client类的构造函数会被执行,但是,当使用该对象的clone()方法创建Client对象时,Client类的构造函数将不会被执行。
(区别)
除了上述四种显式创建对象的方法外,还可以在程序中隐式创建对象,包括以下几种情况:
1行在Java命令中,一个设备会VirtualJava创建一个对应的字符串对象,将其组织成一个字符串数组,然后将该数组作为参数传递给程序的主输入法(Stringargs[])。
2.程序代码中String类型的直接数字对应的是String对象,例如:
After上述程序执行时,有实际上Memory中只有两个String对象,一个是直接数字,由Java虚拟机隐式创建,另一个是new语句显式创建。
3.“+”字符串运算符的结果是一个新的字符串对象。
例如:
4.当Java虚拟机加载一个类时,它会隐式创建一个描述该类的类实例。