引用数据类型的本质:使用new关键字开辟一块新的堆内存,可以被多个栈内存指向。
引用传递:
同一类型的引用数据类型可以进行引用传递,即:
Person per1 = new Person();
Person per2 = per1;
此时Person per2 = per1;语句执行完毕没有开辟新的内存,per2与per1指向同一个堆内存。
在有引用传递的情况下进行赋值
实例代码:
class Person{
String name;
int age;
public void tell(){
system.out.println("姓名:" + name +",年龄:" + age);
}
}
Person per1 = new Person();
per1.name = "张三" ;
per1.age = 18;
Person per2 = per1;//引用传递
per2.age = 20; //修改堆内存空间中的 age 属性的值
per1.tell();//输出结果为 姓名:张三,年龄:20
内存分析:
在进行引用传递时,per2与per1指向同一个引用,此时修改per2的age属性,即为在堆内存中修改age属性的值,所以,在进行输出per1时,per1的age也被改为20.
垃圾的产生
垃圾的产生:在进行实例化引用数据类型时,需要使用new关键字来从堆内存空间中开辟一块新的内存空间,而在此时如果有进行了引用传递,那么没有被栈内存指向的堆内存空间就变成了垃圾,经过一段时间后会被GC垃圾回收机制进行清理,而如果频繁的使用new关键字进行开辟内存空间,当垃圾产生的足够多时,就会影响性能。
实例代码:
class Person{
String name;
int age;
public void tell(){
System.out.println( "姓名:"+name + ",年龄:" + age);
}
Person per1 = new Person();//使用new关键字实例化对象
Person per2 = new Person();
per1.name = "张三"; per1.age = 10 ;
per2.name = "李四"; per2.age = 20;
per2 = per1;//引用传递产生垃圾
内存分析: