这个问题是面试的时候经常会问到的一道题吧?这次做项目的过程中,其中一个同学因为无用了,导致了一个bug,不过是在提测前啦!本来我想借着这次机会分享一下java方法传参的机制,但是经过几天的学习,了解,发现网上的博客基本上没有一篇能让人看后就清清楚楚的明白的,讲的都很囫囵吞枣。觉得要要真正把这个问题说明白还真的不是一件容易的事?要了解jvm的堆栈和堆,以及java中的引用和赋值的含义。我现在也不能清楚的讲明白,但现在应该不会误用了,就是方法调用,知道怎样做可以改变传递参数的值,怎样做是不会改变传递参数的值。下面来个小测试程序,你知道这个程序会答应出什么吗?
public class Test { public static void main(String[] args) { StringBuffer a = new StringBuffer("A"); StringBuffer b = new StringBuffer("B"); int i = 5; operate(a, b, i); System.out.println(a + "," + b + "," + i); } public static void operate(StringBuffer x, StringBuffer y, int j) { x.append(y); y = x; y.append("C"); j = 1; } }
规律总结:
Java参数,不管是原始类型还是引用类型,传递的都是副本
如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.
如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是通过地址改变改变了地址指向的值,那么在函数内的改变会影响到传入的参数。
如果在函数中改变了副本的地址,如当执行如a=其他对象,a=new等赋值操作时,实际上是将a指向新的位置,那么函数外的原值不改变。
时间: 2024-10-27 08:27:10