欢迎访问宙启技术站
智能推送

Java函数参数传递:了解Java中参数的传递方式

发布时间:2023-07-06 11:09:03

在Java中,参数的传递方式有两种:按值传递和按引用传递。

按值传递是指将参数的值复制一份传递给方法或函数。在方法中,对参数的任何改变都不会影响到原始值。这是因为在栈中分配了新的内存空间来存储被拷贝的值。例如:

public class Test {
    public static void main(String[] args) {
        int x = 10;
        System.out.println("Before change: " + x);
        changeValue(x);
        System.out.println("After change: " + x);
    }
    
    public static void changeValue(int num) {
        num = 20;
    }
}

运行上述代码,输出结果为:

Before change: 10
After change: 10

可以看到,方法changeValue()对参数num进行了修改,但是在main()方法中,参数x的值并未发生改变。这表明参数x是按值传递。

按引用传递是指将参数的引用传递给方法或函数。在方法中,对参数引用所指向的对象的改变会影响到原始值。这是因为在栈中传递的是对象的引用地址,而不是对象本身。例如:

public class Test {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hello");
        System.out.println("Before append: " + sb);
        appendValue(sb);
        System.out.println("After append: " + sb);
    }
    
    public static void appendValue(StringBuilder str) {
        str.append(" World!");
    }
}

运行上述代码,输出结果为:

Before append: Hello
After append: Hello World!

可以看到,方法appendValue()对参数str进行了修改,同时也影响到了main()方法中的sb对象。这表明参数sb是按引用传递。

需要注意的是,Java中的基本数据类型(如intfloatchar等)是按值传递的,而对象类型(如StringStringBuilder等)是按引用传递的。但是,在Java中不存在指针类型,因此无法直接修改传递的引用地址。

此外,需要注意的是,Java中的数组是对象类型,因此也是按引用传递的。例如:

public class Test {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        System.out.println("Before change: " + Arrays.toString(arr));
        changeValue(arr);
        System.out.println("After change: " + Arrays.toString(arr));
    }
    
    public static void changeValue(int[] array) {
        array[0] = 10;
    }
}

运行上述代码,输出结果为:

Before change: [1, 2, 3]
After change: [10, 2, 3]

可以看到,方法changeValue()对参数array进行了修改,同样也影响到了main()方法中的arr数组对象。这也验证了数组是按引用传递的。

综上所述,Java中的参数传递方式有按值传递和按引用传递两种。按值传递是将参数的值复制一份传递给方法,在方法中对参数的改变不会影响到原始值;按引用传递是将参数的引用传递给方法,在方法中对参数引用所指向的对象的改变会影响到原始值。需要根据具体的需求选择适合的参数传递方式。