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等)的值传递都能很快明白过来。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容