Java的值传递和引用传递

看过一些Java教材的话,对这句话应该不陌生:

“在Java里面参数传递都是按值传递”这句话的意思是:
按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。

简单的说,基本类型是按值传递的,方法的实参是一个原值的复本。类对象是按对象的引用地址(内存地址)传递地址的值,那么在方法内对这个对象进行修改是会直接反应在原对象上的(或者说这两个引用指向同一内存地址)。不过要注意String这个类型,如下代码:

引用传递示例

String 非基本数据类型,但是String值不可修改

public static void main(String[] args) {
    String x = new String("goeasyway");
    change(x);
    System.out.println(x);
}

public static void change(String x) {
    x = "even";
}

结果


Paste_Image.png

String的对象是不可修改的,如果真正要达到改变字符串的效果,我们需要使用StringBuilder来替代String。

StringBuffer 代替String,引用示例

public static void main(String[] args) {
    StringBuffer sb = new StringBuffer();
    change(sb);
    System.out.println(sb.toString());
}

public static void change(StringBuffer s) {
    s.append("hello");
}

结果


Paste_Image.png

引用传递一个对象

static class Student {
    public int age;
    public String name;

    public Student(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student [age=" + age + ", name=" + name + "]";
    }

}

public static void main(String[] args) {
    Student student = new Student(20, "jack");
    change(student);
    System.out.println(student.toString());
}

public static void change(Student s) {
    s.age = 18;
    s.name = "alice";
}

结果:

Paste_Image.png

你可能感兴趣的:(Java的值传递和引用传递)