引言:
对象是java的一个核心,如果我们能够搞清楚这些对象在内存中是如何存放的,那我们对于java的理解会更加清晰和深刻
我们通过一段代码来分析java对象的内存分配:
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "Tom";
p1.isMale = true;
System.out.println(p1.name);
Person p2 = new Person();
System.out.println(p2.name);
System.out.println(p2.isMale);
Person p3 = p1;
System.out.println(p3.name);
System.out.println(p3.isMale);
p3.age = 10;
System.out.println(p1.age);
}
}
class Person{
//属性
String name;
int age;
boolean isMale;
}
我们知道,内存里通常有栈,堆以及方法区这几块区域(当然,不止于这几块);
1.堆区:(Heap),此内存区域的目的就是存放对象实例(很多情况下,就是你new出来的的对象),几乎所有的对象实例都在这里分配内存。Java虚拟机中对此描述为:所有的对象实力以及数组都要在堆上分配
1.首先呢,类Person里面包含了name,age, isMale三个属性;它们分别是:String , int , boolean 类型;在java中,我们知道,它们的默认值分别是: null , 0 , false。
2.我们在新造出一个p1对象之后,p1是放在栈区的,然后会得到一个地址,通过该地址去找到该对象被实例化的内容( 即 name,age, isMale 等)。
3.在代码中,刚创建出来的对象都是默认值(0,null , false),后来我们通过"对象.属性"的方式对属性进行了重新赋值,在图中这一过程也体现了出来。
4.然后,我们又创建了一个对象p2,p2依然在栈区,但并没有对p2进行初始化,所以打印出来的都是默认值。
5.至于p3,我们并没有为它新创建对象,而是直接将p1在堆空间中的地址分配给了p3,所以当p3对属性进行修改的时候,其实改变的就是p1的内容。
从这里我们看出,每一个对象都独立拥有它的一份内存空间。