Java中的形参与实参

这是大佬智慧的结晶,点击这里进入原文。下面我来总结一下我感兴趣的部分

 

大家猜测一下代码的输出结果是什么?


public class Test{

    public void changeStr(String tmp){        //按照我本人的习惯是设置成静态的

        tmp = "你不是人才!";

    }

public static void main(String args[]){

Test obj = new Test();

        String str = "我是人才!";

        obj.changeStr(str);

        System.out.println(str);

    }

}

很遗憾地告诉大家,结果是”我是人才!”。再联想一下值传递的想法就很清楚了。在main方法那里,生成了一个String对象,值为”我是人才”。然后有个str引用指向了它。当调用changeStr(str)方法时,就把str引用复制了一份(注意,这里是复制了一份str引用),然后再把它传递给changeStr方法。换言之,现在有两个引用指向了那个对象。在方法内部,把那个复制的引用又指向了另一个对象(其值为”你不是人才!”)。但原来那个引用所指向的对象还是没变。因此,你再打印str,自然结果还是”我是人才!”了。

那我们再看一下数组

public class Main{
    public static void f(int[] a) {
        a[1]=10;
    }
    public static void main(String[] args) {
        int[] a=new int[] {1,2,3};
        for(int i:a) System.out.print(i+" ");   //1 2 3
        System.out.println();
        f(a);
        for(int i:a) System.out.print(i+" ");   //1 10 3
        System.out.println();
    }
}

为什么这里a数组的值改变了呢,按说数组和字符串都不是简单类型啊。其实仔细想想不变才真是见鬼了。上面字符串的引用已经指向另一个东东了好吧,你在f里面写a=new int[] {5,6,7};看他还变不变。结果都是1,2,3.所以总结一下就是参数如果是基本类型则采用值传递,参数如果是对象类型则采用引用传递。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值