这是本系列的第二篇博客,继续上一篇的内容我们继续分析。
类跟数组一样,都是属于引用类型,引用类型就是指一堆对内存可以同时被多个栈内存指向。下面来看一下引用传递的简单实例。
1对象的引用传递例1
class Person{ String name; int age; public void tell(){ System.out.println("姓名:"+name+",年龄:"+age); } } public class Test03{ public static void main(String[] args) { Person per1=new Person(); Person per2=per1; per1.name="张三"; per1.age=30; per2.age=33; per1.tell(); per2.tell();
程序运行结果为:
姓名:张三,年龄:33 姓名:张三,年龄:33
从程序的运行结果可以发现,两个对象输出的内容一样,实际上所谓的引用传递,就是将一个堆内存空间的使用权交个多个栈内存空间,每个栈内存空间都可以修改堆内存空间的内容,此程序的内存分配图如下所示:
2对象的引用传递例2
class Person{ String name; int age; public void tell(){ System.out.println("姓名:"+name+",年龄:"+age); } } public class Test04 { public static void main(String[] args) { Person per1=new Person(); Person per2=new Person(); per1.name="张三"; per1.age=30; per2.name="李四"; per2.age=33; per2=per1; per1.tell(); per2.tell(); } }上述程序运行结果为:
姓名:张三,年龄:30 姓名:张三,年龄:30
从程序的输出结果可以发现可Test03一样。不过内存分配发生了一些变化,具体如下所示:
注意点:
Java本身提供垃圾收集机制(Garbage Collection,GC),会不定期施放不用的内存空间,只要对象不用了,就会等待GC释放空间,如上面堆内存中的name="李四";age=33。一个栈内存只能指向一个对内存空间,如果要想再指向其他的堆内存空间,则必须先断开已有的指向才能分配新的指向。在java中主要存在4块内存空间,这些内存的名称及作用如下:
栈内存空间:保存所有的对象名称(更准确地说是保存了引用的堆内存空间的地址)堆内存空间:保存每个对象的具体属性内容。全局数据区:保存static类型的属性。全局代码区:保存所有的方法定义。 关于内存暂时先学习到这里