这到底是怎样一个问题呢?还是用例子说明吧:
public class Parameter{
static void aMethod(){
int a=1; //定义一个int a
change(a);
System.out.println(a);
}
static void change(int a){ //将传入的a加1
a++;
}
public static void main(String[] args){
aMethod(); //执行并输出
}
}
猜猜程序的输出会是什么呢?1还是2?结果是1。为什么呢?
因为a是int 数据,所以作为参数传递的时候,a并没真正传入change(a).传入的是a的一个副本。所以change不管怎么对a进行处理都不会改变aMethod中a的值。
那么有没有办法通过外部的一个方法改变另一个方法里的值呢?当然有,只要使用对象的引用也叫句柄。说起来文绉绉的倒不如举个例子:
import java.util.*; //LinkedList要用到这个包
public class Parameter{
static void aMethod(){
LinkedList a = new LinkedList(); //生成一个LinkedList a对象
a.add("a");
change(a);
for(int i=0;i<a.size();i++){ //将链表中所有数据输出
System.out.println(a.get(i).toString());
}
}
static void change(LinkedList a){ //将传入的a加1
a.add("b"); //为a中再添加一个b
}
public static void main(String[] args){
aMethod(); //执行并输出
}
}
输出的结果是:
a
b
这说明了什么?说明change(LinkedList a)方法已经改变了a中的值。那么为什么a是对象就可以改变呢?我们将a传入change方法的时候传入的不是某个对象,而是这个对象的引用(或者叫做句 柄)插入一句,什么是句柄?比如你,作为一个人,是一个对象,引用(句柄)就是你的身份证号码。当我们把引用作为参数传入方法的时候,引用同样也进行了复 制,但复制后的引用指向同一个对象,所以change()里对a 的改变其实也就是对aMethod()里a的改变,因为他们是同一个对象!
是不是说只要是对象就可以了呢?不一定!
比如String类型的数据,即使你这样生成一个String a对象
String a = new String("go to hell");
a的确是一个对象,但是在a的引用复制的时候,原来的对象也会丢失。其实String 类型的数据在每次改变应用的时候都会清楚原来的对象。
比如在你这么使用的时候:
String a="you";//第一行
a=a+"are fool";//第二行
第一行的a和第二行的a所代表的是完全不同的对象。所以说如果程序里要对String进行大量改变的时候建议不要使用String,如果不小心使用了,你的程序将莫名其妙地占用大量的内存。不用String用什么?用StringBuffer!
本文转自 xhinkerx 51CTO博客,原文链接:http://blog.51cto.com/xhinker/132579,如需转载请自行联系原作者