引用类型数据和基本类型数据作为参数传递是有区别的,
class Demo1{ public static void main(String[] args){ int a = 4; show(a); System.out.println("a="+a); } public static void show(int a){ a = 5; } }
输出结果仍为4
基本数据类型作为参数传递时,就是将基本类型变量实参a空间中的值传递给调用的方法show(),当在show()方法中a视为形参,接受到值后,再在show()方法中对a变量进行操作,这时只会影响到show中的形参a。当show方法执行完成,弹栈后,程序又回到main方法执行,main方法中的实参a值还是原来的值。
class Demo2 { int x ; public static void main(String[] args) { Demo d = new Demo(); d.a = 5; show(d); System.out.println("a="+d.a); } public static void show(Demo d){ d.a = 6; } }
当引用数据类型变量作为参数传递时,这时其实是将引用变量空间中的内存地址(引用)传递给了show方法的d引用变量。这时会有两个引用同时指向堆中的同一个对象。当执行show方法中的d.a=6时,会根据d所持有的引用找到堆中的对象,并将其a属性的值改为6.show方法弹栈。
由于是两个引用指向同一个对象,不管是哪一个引用改变了引用的所指向的对象的中的值,其他引用再次使用都是改变后的值。
所以,基本数据类型作为参数传递时,形参的改变不影响实参的改变,而引用数据类型作为参数传递时,形参改变,实参也相应的做出改变