Java程序定义类的最终目的是使用它,就像使用系统类一样,程序可以创建并使用自定义的类。创建对象的一般格式为: 类名 新建对象名 = new 构造函数();

     如果创建了一个类的多个对象,每个对象就有一套类的属性,不同对象的属性没有任何的关系。当通过某个对象a修改其属性b的值的时候,不会影响到其他对象属性b的值。下面我们来看一下新创建的对象在内存当中是怎样存储起来的。内存结构分为堆和栈,栈中主要存储的是局部变量,所以创建的对象就存储在栈中;而堆中存储的是new出来的结构,比如创建出对象的成员变量。

java 修改对象 java修改对象属性 内存原理_定义类

     下面以一个例子来具体说明,在下面的代码段中,定义了一个Person类,类中有三个属性:姓名、年龄和性别。 在测试类中创建了两个对象p1和p2,而p3不是新创建出来的。

class Person{
	String name;
	int age;
	boolean isMale;
}

class PersonTest{
	public static void main(String[] args) {
		Person p1 = new Person();
		p1.name = "赵印";
		p1.age = 20;
		p1.isMale = true;
		Person p2 = new Person();
		p2.age = 10;
		Person p3 = p1;
		p3.name = "郭艺铭";
	}
}

      Person  p1 = new Person() : 这条语句创建了Person类的一个对象p1,那么p1这个变量是存放在栈中的,new出来的实体存放在堆中,并把实体的首地址传给了变量p1,在还没有更改p1属性值的时候,p1的属性均为默认值。假设实体的首地址值为0x1212,则内存分配如下图所示:

java 修改对象 java修改对象属性 内存原理_属性值_02

        p1.name = "赵印";
        p1.age = 20;
        p1.isMale = true;

    这三条语句负责更改p1属性的值,结果如下:

java 修改对象 java修改对象属性 内存原理_java_03

     语句 Person p2 = new Person();表示新创建了一个名为p2的对象,创建过程和p1相同,p2.age = 10 负责更改p2中的默认属性值。创建p2的结果如下图所示:

java 修改对象 java修改对象属性 内存原理_定义类_04

        Person p3 = p1;
        p3.name = "郭艺铭";

     这两条语句表示把p1对象的地址值赋给了p3,并更改了p3的姓名这一属性值。注意p3不是新创建的对象,因为没有出现new运算符。所以p1和p3指向的是堆中的同一片实体空间,对p3中属性值的更改会影响到p1中的值。如下图所示:

java 修改对象 java修改对象属性 内存原理_定义类_05