Java 值传递、引用传递

    

开始之前,我们先来搞懂下面这两个概念:

  • 形参&实参
  • 值传递&引用传递

方法的定义可能会用到 参数(有参的方法),参数在程序语言中分为:

  • 实参(实际参数,Arguments):用于传递给函数/方法的参数,必须有确定的值。
  • 形参(形式参数,Parameters):用于定义函数/方法,接收实参,不需要有确定的值。
String hello = "Hello!";
// hello 为实参
sayHello(hello);
// str 为形参
void sayHello(String str) {
    System.out.println(str);
}

 

值传递、引用传递

        程序设计语言将实参传递给方法(或函数)的方式分为两种:

  • 值传递:方法接收的是实参值的拷贝,会创建副本。
  • 引用传递:方法接收的直接是实参所引用的对象在堆中的地址,不会创建副本,对形参的修改将影响到实参。

        很多程序设计语言(比如 C++、 Pascal )提供了两种参数传递的方式,不过,在 Java 中只有值传递。

         在Java中,参数传递是通过值传递(pass-by-value)进行的。这意味着当你将一个变量作为参数传递给一个方法时,实际上传递的是该变量的值的副本,而不是变量本身。

        对于基本数据类型(如int、float、boolean等),它们被存储在栈内存中,当你将一个基本数据类型作为参数传递给一个方法时,传递的是该值的副本,方法中的修改不会影响原始的变量。

示例:

public class Main {
    public static void main(String[] args) {
        int x = 10;
        modifyValue(x);
        System.out.println(x);  // 输出: 10
    }
    
    public static void modifyValue(int value) {
        value = 20;
    }
}

        对于引用类型(如数组、对象等),变量存储的是对象在堆内存中的引用地址。当你将一个引用类型作为参数传递给一个方法时,传递的是引用的副本,但这两个引用仍指向同一个对象,因此方法中的修改会影响到原始的对象。

示例:

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        modifyArray(arr);
        System.out.println(Arrays.toString(arr));  // 输出: [4, 5, 6]
        
        Person person = new Person("Alice");
        modifyPerson(person);
        System.out.println(person.getName());  // 输出: Bob
    }
    
    public static void modifyArray(int[] array) {
        array[0] = 4;
        array[1] = 5;
        array[2] = 6;
    }
    
    public static void modifyPerson(Person p) {
        p.setName("Bob");
    }
}

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;
    }
}

        在上述示例中,方法modifyArraymodifyPerson分别修改了传递进来的数组和对象的属性,这些修改会反映在原始的变量上。

        因此,尽管Java中的参数传递是通过值传递进行的,但对于引用类型,实际上是通过传递引用的副本来操作同一个对象。这常常被称为"引用传递",但严格来说它仍然是值传递的一种形式。

更多消息资讯,请访问昂焱数据。

你可能感兴趣的:(java,java,开发语言)