java中有没有引用传递

这个问题网上很多人讨论,有人说既有值传递,又有引用传递,还有人说只有值传递,说只有值传递的人是对的,但是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等)的值传递都能很快明白过来。

你可能感兴趣的:(java中有没有引用传递)