这个问题网上很多人讨论,有人说既有值传递,又有引用传递,还有人说只有值传递,说只有值传递的人是对的,但是99%的人却解释不清楚,下面我给大家解释一下:
我们首先看一段代码
public static void main(String[] args) {
String str="old";
setStr(str);
System.out.println(str);//输出的是:old
}
public static void setStr(String str){
str="new";
}
为什么输出的是old?因为我说了只有值传递,也就是说当你调用setStr(str)
的时候,相当于调用的是setStr("old")
,所以str
变量的值没有改变,输出的还是old。
下面再看一段代码
public class String2{
private String s;
public String2(String s) {
this.s = s;
}
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
@Override
public String toString() {
return s;
}
}
public static void main(String[] args) {
String2 str=new String2("old");
setStr(str);
System.out.println(str);//输出的是:new
}
public static void setStr(String2 str){
str.setStr("new");
//str=new String2("new");//如果是这样赋值,最终输出的还会是:old
}
有人肯定会问,为什么到了这里输出的是new?
很简单,因为在调用setStr(str)
方法时我们把str的值传递过去了,值里面包含一个String
类的引用s
,所以当我们把s
的值改了以后,外部变量str
的值也会跟着改变。
所以只要我们弄明白值内部引用的问题,碰到任何类型(比如Long,int等)的值传递都能很快明白过来。