📜  Java是严格按值传递的!(1)

📅  最后修改于: 2023-12-03 15:02:04.998000             🧑  作者: Mango

Java是严格按值传递的!

在Java中,传递参数的方式有两种:值传递和引用传递。这两种传递方式在很多情况下会被程序员所混淆。本文将针对Java的值传递做出详细的介绍。

什么是值传递?

值传递,就是将实参的值复制一份,传递给形参,让形参和实参的值完全独立,互不影响。当形参发生改变时,不会影响到实参的值。这种传递方式常见于基本数据类型和字符串类型。下面是一个例子:

public class Example {
    public static void main(String[] args) {
        int a = 1;
        int b = 2;
        swap(a, b);
        System.out.println("a=" + a + " b=" + b);
    }

    public static void swap(int x, int y) {
        int temp = x;
        x = y;
        y = temp;
    }
}

输出结果为:

a=1 b=2

在这个例子中,我们声明了一个swap方法用于交换参数的值,但是打印出来的结果却没有发生变化,因为在方法内部对参数进行的操作并不会影响到外部的实参,这就是值传递的特点。

Java中的值传递

Java只支持按值传递,不支持按引用传递。也就是说,Java中的所有参数传递都是以值传递的方式进行的。

不仅基本数据类型和字符串类型如此,即使传递对象的时候,也是将对象的引用(地址)复制一份,传递给形参。因此,如果在方法内部改变了形参所引用的对象的属性,这个改变将持续到方法结束。但是,如果在方法内部重新为形参赋值(例如:p=new Person()),这个赋值并不会影响到调用者所引用的那个对象。

下面是一个例子:

public class Example {
    public static void main(String[] args) {
        Person p = new Person("Tom", 18);
        changePerson(p);
        System.out.println("name=" + p.getName() + " age=" + p.getAge());
    }

    public static void changePerson(Person person) {
        person.setAge(20);
    }
}

class Person {
    private String name;
    private int age;

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

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }
}

输出结果为:

name=Tom age=20

在这个例子中,我们声明了一个Person类,其中有nameage两个属性,还定义了一个changePerson方法,用于修改传入的Person对象的age属性。但是,在调用changePerson方法后,我们再次输出Person对象的age属性时,它已经被修改成了20,说明方法内部的修改是生效的。

结论

Java中只支持按值传递,不支持按引用传递。在Java中,基本数据类型和字符串类型通过值传递,而对象类型则是将其引用复制一份后传递,但是对于对象属性的修改会影响到原对象的属性值。