赞
踩
在Java中,当对象作为参数传递时,究竟传递的是对象的值,还是对象的引用?
先说结论,无论你传的是基本数据类型还是引用类型,都是值传递。(因为引用类型只不过是把指向对象的地址拷贝一份传递给形参)。
这样理解,引用类型的变量存储在栈中,其数值表示堆上对象的内存地址。调用函数时,会把这个变量的值(引用类型的话也就是对象地址)拷贝一份在栈上,传递给函数,此时在函数内重新给形参赋值并不会影响到外部的那个变量(实参)。而通过这个形参修改指向的对象时,因为形参与实参指向的是同一个对象,所以影响的是同一个对象。
比如方法A中把对象引用list(作为指针p1)传递给方法B,那么B中的方法栈里会复制一份list指向的地址(作为指针p2)。 p1和p2指向的内容一定是一样的,p2修改了对象内容,比如add了一个数,那么p1也可以访问到这个数。但是 如果在方法B里改变了指针p2指向的地址, p1是不受影响的,因为是两个方法栈。 (Java没有指针,上面用指针表示 只是为了更容易理解)
画个图:
看下面这个例子:
public class Main { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); list.add(1); list.add(2);list.add(3); list.add(4); addList(list); for (int num : list) System.out.print(String.valueOf(num) + " "); System.out.println(); changeList(list); for (int num : list) System.out.print(String.valueOf(num) + " "); } public static void addList(ArrayList<Integer> list) { list.add(5); } public static void changeList(ArrayList<Integer> list) { list = new ArrayList<>(); list.add(6); list.add(7); } } 输出: 1 2 3 4 5 // 可以使用形参修改 1 2 3 4 5 // 但是,把形参指向别人,不影响原来传递的引用内容
所以,之前刷题的时候,妄想通过传递方法参数,来实现全局变量的效果是失败的!
比如 剪纸offer里 二叉搜索树转换成双向链表的题,见题解。
因为方法返回之后,原来传递的是null,现在还是null.
其实,idea就有相关提示,可能你没有注意,你看这个例子。
在第一个方法里,当你add(修改)引用内容的时候,list下面没有提示
第二个方法里,当你改变了形参list指向内容时,它就给你整灰色了,还有下划线。
(1)基本数据类型int,double
等传值,对形参的修改不会影响实参;
(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;如果形参指针指向别的对象,则不会对原有对象造成影响。
(3)String, Integer, Double
等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。