[Java Basic] 如何区分Java方法中参数传递的值传递和引用传递?

如何区分Java方法中参数传递的值传递和引用传递?

该内容整理自Chat - GPT4
相关软件:Cursor

要了解这个问题首先要理解Java中的数据类型的概念:

  • Java中的数据类型分为基本数据类型引用数据类型。基本数据类型包括byte、short、int、long、float、double、char和boolean,它们是Java语言中最基本的数据类型,用于存储简单的值。
  • 引用数据类型包括类、接口、数组等,它们是由基本数据类型或其他引用数据类型组成的。

有了基本数据类型和引用数据类型的概念后,再来理解参数传递:

  • 在Java中,参数传递有两种方式:值传递引用传递
  • 对于基本数据类型,采用的是值传递,而对于对象类型,采用的是引用传递
  • 在方法中,如果对一个对象进行修改,那么这个对象的状态会被修改,因为传递的是对象的引用。如果只是修改对象的属性,那么这个对象的状态也会被修改
  • 如果在方法中对一个基本数据类型进行修改,那么这个基本数据类型的值不会被修改,因为传递的是值的拷贝。如果只是修改基本数据类型的值,那么这个基本数据类型的值也不会被修改

在这里插入图片描述

关于值传递的例子:

public class Main {
    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 a, int b) {
        int temp = a;
        a = b;
        b = temp;
    }
}
  • 输出结果为:a = 1, b = 2。可以看到,a和b的值并没有被交换。这是因为在swap方法中,a和b是基本数据类型,采用的是值传递,所以交换的只是a和b的拷贝,而不是a和b的值。 如果要交换a和b的值,可以将a和b定义为数组或者对象类型,采用引用传递的方式。

关于引用传递的例子:

class Person {
    private String name;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person("Alice");
        System.out.println("Before changeName method: " + person.getName());
        changeName(person);
        System.out.println("After changeName method: " + person.getName());
    }

    public static void changeName(Person person) {
        person.setName("Bob");
    }
}
  • 在这个例子中,我们创建了一个名为Person的类,它有一个名为name的私有属性和两个公共方法:getName和setName。
  • 我们还创建了一个名为Main的类,它有一个名为main的公共静态方法。在main方法中,我们创建了一个名为person的Person对象,并将其name属性设置为"Alice"。
  • 然后,我们调用了changeName方法,并将person对象作为参数传递给它。在changeName方法中,我们将person对象的name属性设置为"Bob"。
  • 最后,我们在main方法中打印了person对象的name属性,以显示它是否已被修改。运行这个程序,你会看到输出:
Before changeName method: Alice
After changeName method: Bob
  • 这表明,当我们将person对象作为参数传递给changeName方法时,实际上传递的是对象的引用。因此,当我们在changeName方法中修改person对象的name属性时,这个对象的状态也会在main方法中被修改。

猜你喜欢

转载自blog.csdn.net/m0_54524462/article/details/129740117