您的当前位置:首页正文

Java中的传递类型

来源:个人技术集锦

1. 基本数据类型的传递

对于 基本数据类型(例如 intdoubleboolean 等),Java 会将值的副本传递给方法。因此,在方法内部修改该参数的值不会影响到原始变量。

示例:

public class PassByValueExample {
    public static void main(String[] args) {
        int number = 10;
        modifyPrimitive(number);
        System.out.println("After modifyPrimitive: " + number); // 输出 10,值未改变
    }

    public static void modifyPrimitive(int num) {
        num = 20; // 仅仅修改了 num 的副本,原始变量不受影响
    }
}

输出:

After modifyPrimitive: 10

在上面的代码中,modifyPrimitive 方法中对 num 的修改不会影响到原始变量 number,因为 numnumber 值的副本。

2. 引用数据类型的传递

示例:

import java.util.ArrayList;
import java.util.List;

public class PassByValueExample {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("Alice");
        modifyList(names);
        System.out.println("After modifyList: " + names); // 输出 ["Alice", "Bob"]
    }

    public static void modifyList(List<String> list) {
        list.add("Bob"); // 修改了 list 引用指向的对象,原始对象被修改
    }
}

输出:

After modifyList: [Alice, Bob]

在这个例子中,names 引用指向的 List 对象被传递给了 modifyList 方法。虽然 names 引用本身没有被修改,但由于 listnames 指向同一个对象,所以在 list 上的修改反映在了 names 上。

引用的重新赋值不会影响原始对象

如果在方法内部将引用重新赋值,那么这只会改变局部引用的值,而不会影响原始引用。

示例:

public class PassByValueExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hello");
        modifyReference(sb);
        System.out.println("After modifyReference: " + sb); // 输出 "Hello",没有改变
    }

    public static void modifyReference(StringBuilder sb) {
        sb = new StringBuilder("Goodbye"); // 重新赋值,不影响原始对象
    }
}

输出:

After modifyReference: Hello

在这个例子中,modifyReference 方法中重新给 sb 赋值,但这不会影响 main 方法中的原始 sb,因为 sb 的重新赋值只是改变了 modifyReference 方法中局部引用的值。

总结

  • Java 中只有按值传递
  • 基本数据类型:传递的是值的副本,方法内部的修改不会影响原始变量。
  • 引用数据类型:传递的是引用的副本,可以通过引用修改对象的内容,但重新赋值不会影响原始引用。

因篇幅问题不能全部显示,请点此查看更多更全内容