Person p = new Person();//Person类中有name、age两个成员变量
这段代码创建了一个p变量,一个Person对量。Person对象包含两个Field,而Field是需要内存来存储的,因此,当创建Person对象时,必然需要有对应的内存来存储Person对象的Field。Person对象位于堆内存中,P作为引用变量,位于栈内存中。两者关系如下:
在java中,每new一个对象,就会在堆内存中开辟相应的空间,java程序不允许直接访问堆内存中的对象,只能通过该对象的引用来操作对象。上图中,p作为引用变量,只存储了一个地址值,并未包含任何实际数据,但它指向实际的Person对象,当访问p引用变量的Field和方法时,实际上是访问p所引用对象的Field和方法;如果堆内存中的对象没有任何变量指向该对象时,那么程序将无法访问该对象,该对象就变成了垃圾,java的垃圾回收机制将回收该对象。下面举例子来说一下引用
例1:
new两个对象,那么在堆内存中就会有两个对象。p1、p2分别指向各自的引用
Person p1 = new Person();
Person p2 = new Person();
p1.setName("王三");
p2.setName("李四");
System.out.println(p1.getName());
System.out.println(p2.getName());
结果
王三
李四
引用图
各自修改各自的互不干扰。
用例2,两个引用变量,指向同一对象,那么当一个引用变量操作对象的方法改变Field时,另一个引用对象再获取到的就是改变后的值。具体例子如下
Person p1 = new Person();
Person p2=p1;
p1.setName("王三");
System.out.println(p1.getName());
System.out.println(p2.getName());
p2.setName("李四");
System.out.println(p1.getName());
System.out.println(p2.getName());
运行结果如下:
王三
王三
李四
李四
图示如下: