全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-09 6 分钟 ✍️ juanwangdev

方法的参数传递

理解Java参数传递机制是掌握方法的关键。

值传递概念

Java只有值传递

Java中所有参数传递都是值传递(传递副本)。

Java
// 值传递:传递数据的副本
// 1. 基本类型:传递值的副本
// 2. 引用类型:传递引用的副本(地址的副本)

基本类型参数传递

传递值副本

Java
public void changeValue(int num) {
    num = 100;  // 修改副本
}

int x = 10;
changeValue(x);
System.out.println(x);  // 10(原值不变)

传递过程示意

Java
调用:changeValue(x)
         ↓
传递:x的值副本10 → num
         ↓
修改:num = 100(副本被修改)
         ↓
结果:x仍是10(原值未受影响)

各种基本类型

Java
public void modify(int a, double b, boolean c) {
    a = 100;
    b = 99.9;
    c = true;
    // 修改的都是副本
}

int i = 1;
double d = 1.1;
boolean flag = false;

modify(i, d, flag);

System.out.println(i);      // 1(不变)
System.out.println(d);      // 1.1(不变)
System.out.println(flag);   // false(不变)

引用类型参数传递

传递引用副本

引用类型传递的是引用(地址)的副本,指向同一对象。

Java
public void changeArray(int[] arr) {
    arr[0] = 100;  // 通过引用修改数组内容
}

int[] nums = {1, 2, 3};
changeArray(nums);
System.out.println(nums[0]);  // 100(原数组被修改)

传递过程示意

Java
调用:changeArray(nums)
         ↓
传递:nums引用副本 → arr(指向同一数组)
         ↓
修改:arr[0] = 100(通过引用修改数组内容)
         ↓
结果:nums[0]变为100(同一数组)

对象参数传递

Java
public class Student {
    String name;
    
    public Student(String name) {
        this.name = name;
    }
}

public void changeName(Student s) {
    s.name = "新名字";  // 通过引用修改对象属性
}

Student stu = new Student("原名");
changeName(stu);
System.out.println(stu.name);  // "新名字"(原对象被修改)

引用重新赋值不影响原引用

Java
public void reassign(Student s) {
    s = new Student("其他人");  // 引用副本指向新对象
    // 原引用不受影响
}

Student stu = new Student("张三");
reassign(stu);
System.out.println(stu.name);  // "张三"(原引用不变)

基本类型与引用类型对比

传递行为对比

类型传递内容方法内修改影响
基本类型值副本不影响原变量
引用类型引用副本修改对象内容会影响原对象
引用类型引用副本重新赋值不影响原引用
Java
// 基本类型:传递值副本
public void test1(int num) {
    num = 100;  // 不影响原变量
}

// 引用类型:修改对象内容
public void test2(int[] arr) {
    arr[0] = 100;  // 影响原数组
}

// 引用类型:重新赋值
public void test3(int[] arr) {
    arr = new int[5];  // 不影响原引用
}

数组参数示例

修改数组元素

Java
public void doubleArray(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        arr[i] = arr[i] * 2;  // 修改原数组
    }
}

int[] nums = {1, 2, 3};
doubleArray(nums);
// nums变为:{2, 4, 6}

数组作为参数遍历

Java
public void printArray(int[] arr) {
    for (int num : arr) {
        System.out.println(num);
    }
}

int[] nums = {1, 2, 3};
printArray(nums);  // 输出1, 2, 3

数组作为参数查找

Java
public int findMax(int[] arr) {
    int max = arr[0];
    for (int i = 1; i < arr.length; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    return max;
}

int[] nums = {5, 2, 8, 1, 9};
int max = findMax(nums);  // 9

对象参数示例

修改对象属性

Java
public class Person {
    String name;
    int age;
}

public void updatePerson(Person p, String name, int age) {
    p.name = name;  // 修改原对象
    p.age = age;
}

Person person = new Person();
updatePerson(person, "张三", 25);
System.out.println(person.name);  // "张三"
System.out.println(person.age);   // 25

对象方法调用

Java
public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

public void useCalculator(Calculator calc) {
    int result = calc.add(5, 3);  // 通过引用调用方法
    System.out.println(result);
}

Calculator myCalc = new Calculator();
useCalculator(myCalc);  // 输出:8

String参数特殊性

String不可变

String作为参数,修改不影响原字符串。

Java
public void changeString(String str) {
    str = "新字符串";  // 引用副本指向新对象
    // 原字符串不变(String不可变)
}

String s = "原字符串";
changeString(s);
System.out.println(s);  // "原字符串"(不变)

String参数特点

  • String是引用类型,但不可变
  • 方法内重新赋值不影响原引用
  • 方法内调用方法(如substring)产生新字符串
Java
public void process(String str) {
    str = str.toUpperCase();  // 返回新字符串,原不变
}

String s = "hello";
process(s);
System.out.println(s);  // "hello"(不变)

多参数传递

多个参数

Java
public int calculate(int a, int b, String op) {
    if ("add".equals(op)) {
        return a + b;
    } else if ("sub".equals(op)) {
        return a - b;
    }
    return 0;
}

int result = calculate(10, 5, "add");  // 15

可变参数

Java
public int sum(int... nums) {
    int total = 0;
    for (int num : nums) {
        total += num;
    }
    return total;
}

// 调用方式灵活
int r1 = sum(1, 2, 3);       // 6
int r2 = sum(1, 2, 3, 4, 5); // 15
int r3 = sum();              // 0

// 也可传数组
int[] arr = {1, 2, 3};
int r4 = sum(arr);           // 6

参数传递误区

误区1:Java有引用传递

text
// Java只有值传递,没有引用传递
// 引用类型传递的是引用的副本,不是引用本身

public void reassign(int[] arr) {
    arr = new int[5];  // 引用副本指向新数组
    // 原引用不变
}

误区2:基本类型传递会改变原值

text
// 基本类型传递值副本,不会改变原值

public void modify(int x) {
    x = 100;
}

int a = 10;
modify(a);
// a仍是10

要点总结

  • Java参数传递都是值传递
  • 基本类型:传递值副本,不影响原变量
  • 引用类型:传递引用副本(地址副本)
  • 引用类型修改对象内容会影响原对象
  • 引用类型重新赋值不影响原引用
  • String不可变,传递后修改不影响原字符串
  • 数组是引用类型,修改元素影响原数组
  • 可变参数用...表示,接受任意数量参数
  • 可变参数本质是数组
  • 方法内无法改变原引用指向

📝 发现内容有误?点击此处直接编辑

← 上一篇 数组的遍历
下一篇 → 方法的定义与调用
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库