yxhxj2006

常用链接

统计

最新评论

java中的参数传递

这到底是怎样一个问题呢?还是用例子说明吧:
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!

posted on 2013-08-08 21:39 奋斗成就男人 阅读(169) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: