当前位置: 代码迷 >> 综合 >> Java中的形参与实参
  详细解决方案

Java中的形参与实参

热度:62   发布时间:2023-09-22 05:59:13.0

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

 

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


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 3System.out.println();f(a);for(int i:a) System.out.print(i+" ");   //1 10 3System.out.println();}
}

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