首页 > 文章列表 > Java中的参数传递方式到底是按值传递还是按引用传递?

Java中的参数传递方式到底是按值传递还是按引用传递?

引用传递 值传递 参数传递方式
333 2024-01-30

Java中的参数传递方式究竟是值传递还是引用传递?

在Java中,参数传递的方式既有值传递也有引用传递,具体取决于参数的类型。

  1. 值传递(Pass by Value)
    值传递是指在方法调用时,将实际参数的副本传递给方法的形式参数。在方法中改变形式参数的值,并不会影响实际参数的值。

示例代码如下:

public class PassByValueExample {
    public static void main(String[] args) {
        int number = 10;
        modifyValue(number);
        System.out.println("Number after method call: " + number);
    }
    
    public static void modifyValue(int value) {
        value = 20;
        System.out.println("Value inside method: " + value);
    }
}

输出结果如下:

Value inside method: 20
Number after method call: 10

在上述代码中,modifyValue方法接受一个整数类型的参数value。在方法内部,将value的值改为20,然后打印出来。但是,在main方法中打印number的值时,发现number仍然是10,说明改变形式参数的值并不会影响实际参数的值。

  1. 引用传递(Pass by Reference)
    引用传递是指在方法调用时,实际参数的引用(内存地址)被传递给方法的形式参数。在方法中对形式参数所指向的对象进行修改,会改变实际参数所引用的对象的状态。

示例代码如下:

public class PassByReferenceExample {
    public static void main(String[] args) {
        StringBuilder name = new StringBuilder("Alice");
        modifyName(name);
        System.out.println("Name after method call: " + name);
    }
    
    public static void modifyName(StringBuilder builder) {
        builder.append(" Smith");
        System.out.println("Name inside method: " + builder);
    }
}

输出结果如下:

Name inside method: Alice Smith
Name after method call: Alice Smith

在上述代码中,modifyName方法接受一个StringBuilder类型的参数builder。在方法内部,将builder所指向的对象追加了" Smith",然后打印出来。在main方法中打印name时,发现name变成了"Alice Smith",说明改变形式参数的值会影响实际参数所引用的对象的状态。

需要注意的是,虽然Java中存在引用传递的情况,但是Java并没有提供直接通过引用改变实际参数值的方式。比如,不能通过在方法中给形式参数分配新的内存地址来改变实际参数的引用。

总结起来,Java中的参数传递方式是根据参数的类型来决定的。对于基本数据类型(如intchar等),采用值传递;对于对象类型,采用引用传递。值传递只是对实际参数的副本进行操作,而引用传递则是对实际参数所引用的对象进行操作。