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.所以总结一下就是参数如果是基本类型则采用值传递,参数如果是对象类型则采用引用传递。

猜你喜欢

转载自blog.csdn.net/qq_34428553/article/details/79765657