基本类型和引用类型
基本类型变量和引用类型变量的区别:
每个变量都代表一个存储值的内存位置 。 声明一个变量时 , 就是在告诉编译器这个变量可以存放什么类型的值 。 对基本类型变量来说 , 对应内存所存储的值是基本类型值 。 对引用类型变量来说 , 对应内存所存储的值是一个引用 , 是对象的存储地址 。
将一个变量陚值给另一个变量时 , 另一个变量就被赋予同样的值 。 对基本类型变量而言 , 就是将一个变量的实际值赋给另一个变量 。 对引用类型变量 , 就是将一个变量的引用赋给另一个变量 。
如果某个对象不再需要时,可以显式的给该对象的引用变量赋null值。如果该对象没有被任何引用变量所引用,Java虚拟机将自动回收它所占的空间。
如下图,对引用变量来讲,赋值语句c1=c2是将c2的引用赋给c1。赋值之后,变量c1和c2指向同一个对象。
如上图,执行完赋值语句c1=c2之后,c1指向c2所指的同一个对象。c1以前引用的对象就不在有用。因此,现在他就成为垃圾。垃圾会占用内存空间。Java运行系统就会检测垃圾并自动回收它所占用的空间, 这个过称为垃圾回收。
基本类型和引用类型作为参数传递:
基本类型作为参数传递
基本类型的形式参数的改变不影响实际参数。
形式参数是基本类型:
class Demo {
public int sum(int a,int b) {
return a + b;
}
}
我用如下代码进行说明并配合图让我们理解的更清楚
基本类型作为参数传递时,其实就是将基本类型变量x空间中的值复制了一份传递给调用的方法show(),当在show()方法中x接受到了复制的值,再在show()方法中对x变量进行操作,这时只会影响到show中的x。当show方法执行完成,弹栈后,程序又回到main方法执行,main方法中的x值还是原来的值。
引用类型作为参数传递
引用类型的形式参数的改变直接影响实际参数
形式参数是引用类型:
class Student {
public void show() {
System.out.println("我爱学习");
}
}
当引用变量作为参数传递时,这时其实是将引用变量空间中的内存地址(引用)复制了一份传递给了show方法的d引用变量。这时会有两个引用同时指向堆中的同一个对象。当执行show方法中的d.x=6时,会根据d所持有的引用找到堆中的对象,并将其x属性的值改为6.show方法弹栈。
由于是两个引用指向同一个对象,不管是哪一个引用改变了引用的所指向的对象的中的值,其他引用再次使用都是改变后的值