Java对象值传递和对象传递的概括
发布时间:2021-11-22 09:31:56 所属栏目:PHP教程 来源:互联网
导读:前两天项目lead面试我,问的第一个问题就是值传递和对象传递的问题,这问题之前只知道皮毛,不是很清晰,今天专门总结下。 先看基本类型作为参数传递的例子: public class Test1 { public static void main(String[] args) { int n = 3; System.out.println
前两天项目lead面试我,问的第一个问题就是值传递和对象传递的问题,这问题之前只知道皮毛,不是很清晰,今天专门总结下。 先看基本类型作为参数传递的例子: public class Test1 { public static void main(String[] args) { int n = 3; System.out.println("Before change, n = " + n); changeData(n); System.out.println("After changeData(n), n = " + n); } public static void changeData(int nn) { nn = 10; } } 我想这个例子大家都明白,基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的,输出的结果证明了这一点: Before change, n = 3 After changeData(n), n = 3 那么,我们现在来看看对象作为参数传递的例子,这也是大家争论的地方。 public class Test2 { public static void main(String[] args) { StringBuffer sb = new StringBuffer("Hello "); System.out.println("Before change, sb = " + sb); changeData(sb); System.out.println("After changeData(n), sb = " + sb); } public static void changeData(StringBuffer strBuf) { strBuf.append("World!"); } } 先看输出结果: Before change, sb = Hello After changeData(n), sb = Hello World! 从结果来看,sb的值被改变了,那么是不是可以说:对象作为参数传递时,是把对象的引用传递过去,如果引用在方法内被改变了,那么原对象也跟着改变。从上面例子的输出结果来看,这样解释是合理。 现在我们对上面的例子稍加改动一下: public class Test3 { public static void main(String[] args) { StringBuffer sb = new StringBuffer("Hello "); System.out.println("Before change, sb = " + sb); changeData(sb); System.out.println("After changeData(n), sb = " + sb); } public static void changeData(StringBuffer strBuf) { strBuf = new StringBuffer("Hi "); strBuf.append("World!"); } } 按照上面例子的经验:对象作为参数传递时,是把对象的引用传递过去,如果引用在方法内被改变了,那么原对象也跟着改变。你会认为应该输出: Before change, sb = Hello After changeData(n), sb = Hi World! 但运行一下这个程序,你会发现结果是这样的: Before change, sb = Hello After changeData(n), sb = Hello 这就是让人迷惑的地方,对象作为参数传递时,同样是在方法内改变了对象的值,为什么有的是改变了原对象的值,而有的并没有改变原对象的值呢?这时候究竟是“传值”还是“传引用”呢? 下面就让我们仔细分析一下,来揭开这中间的奥秘吧。 先看Test2这个程序: StringBuffer sb = new StringBuffer("Hello "); 这一句执行完后,就会在内存的堆里生成一个sb对象.sb是一个引用,里面存放的是一个地址“@3a”(这个“@3a”是我举的代表内存地址的例子,你只需知道是个内存地址就行了),而这个地址正是“Hello ”这个字符串在内存中的地址。 执行这一句后,就把sb传给了changeData方法中的StringBuffer strBuf,由于sb中存放的是地址,所以,strBuf中也将存放相同的地址,请看 此时,sb和strBuf中由于存放的内存地址相同,因此都指向了“Hello”。 strBuf.append("World!"); 执行changeData方法中的这一句后,改变了strBuf指向的内存中的值, 所以,Test2 这个程序最后会输出: After changeData(n), sb = Hello World! ![]() (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |