1 class Person2{ 2 public String name ; //类中的name属性 3 public int age ; //类中的age属性 4 public void eat() { //类中的eat()方法 5 System.out.println("姓名:"+name + "年龄"+age); 6 } 7 } 8 public class ClassDemo2 { //定义一个类 9 public static void main(String args[]){ 10 Person2 p2 = new Person2(); //声明并实例化对象 11 p2.name="zhangbojie" ; 12 p2.age = 20 ; 13 Person2 p3 = null ; 14 p3 = p2 ; //把p2的引用传递给P3 15 p3.name = "张博杰" ; //p3修改了姓名和年龄 16 p3.age = 21; 17 p3.eat() ; //调用Person2类中的eat()方法 18 } 19 }
此时两个对象指向 的是同一块内存空间,所以任何一个对象修改了属性的内容,都会影响另一个对象。 在引用操作过程中,一块堆内存可以被多个栈内存索引用。但是反过来,一个栈内存只能保存一块堆内存的地址。
继续观察引用传递
1 class Person2{ 2 public String name ; //类中的name属性 3 public int age ; //类中的age属性 4 public void eat() { //类中的eat()方法 5 System.out.println("姓名:"+name + "年龄"+age); 6 } 7 } 8 public class ClassDemo2 { //定义一个类 9 public static void main(String args[]){ 10 Person2 p2 = new Person2(); //声明并实例化对象 11 Person2 p3 = new Person2(); 12 p2.name="zhangbojie" ; 13 p2.age = 20 ; 14 p3 = p2 ; //把p2的引用传递给P3 15 p3.name = "张博杰" ; //p3修改了姓名和年龄 16 p2.eat() ; //调用Person2类中的eat()方法 17 } 18 }
通过内存的分析可以看出来,在引用数据关系里面,一块没有栈内存指向的堆内存的空间,就将成为垃圾,所有的垃圾会被垃圾回收机制(GC)不定期的进行回收,回收之后就会释放掉其所占的内存。
总结:
1、类描述的是公共的特征,类必须要实例化对象才可以使用。
2、堆内存中保存的是所有属性的内容,而栈内存保存的是堆内存的地址。
3、垃圾空间指的是没有栈内存空间引用的堆内存空间。