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

Java函数的参数传递方式和常见错误

发布时间:2023-05-19 22:00:39

Java函数的参数传递方式和常见错误

Java函数的参数传递方式有两种:值传递和引用传递。其中,值传递是指将参数的值(也就是实参的值)复制一份,传递给函数中的形参;而引用传递是指传递实参的引用(也就是地址),使得函数中的形参指向了实参所指向的数据。下面,我们将分别介绍这两种传递方式以及它们的常见错误。

1. 值传递

值传递是Java中的一种传递方式,当使用这种方式传递参数时,函数接收到的是实际参数的拷贝,也就是说,函数内部的操作不会影响到实际参数本身。值传递只是将实际参数拷贝一份,然后将这份拷贝传递给函数,在函数内部处理时,只是处理了这份拷贝。当函数返回后,这份拷贝也就被销毁了。

常见错误:

(1)误以为在函数内部更改了形参就能改变实参。

实参的值一般不会因为形参的更改而改变,因为改变的是拷贝,不是原始参数。例如下面的代码:

public class Test {

    public static void main(String[] args) {

        int a = 5;

        changeValue(a);

        System.out.println(a);

    }

    public static void changeValue(int x) {

        x = 10;

    }

}

执行结果为:

5

可以看到,即使在函数changeValue()中将形参x的值改为10,但打印出的结果仍然是5。

(2)误以为传递数组进入函数中可以修改数组的值。

将数组作为参数传递给函数时,传递的是数组首元素的地址,而不是整个数组的地址。也就是说,在函数中修改数组元素的值时,修改的是数组元素的值,而不是数组本身。例如:

public class Test {

    public static void main(String[] args) {

        int[] arr = {1, 2, 3};

        changeArr(arr);

        System.out.println(Arrays.toString(arr));

    }

    public static void changeArr(int[] arr) {

        for (int i = 0; i < arr.length; i++) {

            arr[i] += 1;

        }

    }

}

输出结果为:

[2, 3, 4]

由此可见,在函数changeArr()中我们修改的是数组元素的值,而不是数组本身。

2. 引用传递

引用传递是一种特殊的传递方式,与值传递不同的是,引用传递传递的是对象的引用,也就是内存地址。具体而言,如果传递的实参是对象,则此时传递的实参就是对象的引用。在此情况下,对形参的修改就是对实参的修改,因为它们引用的是同一块内存区域。

常见错误:

(1)对形参进行重复的创建和赋值。

在函数中创建、赋值的变量是形参,这是一份新的内存空间,值更改也只会在该空间中实现。例如:

public class Test {

    public static void main(String[] args) {

        StringBuilder s = new StringBuilder("hello");

        changeString(s);

        System.out.println(s);

    }

    public static void changeString(StringBuilder s) {

        s = new StringBuilder("world");

    }

}

输出结果为:

hello

这是因为,在函数changeString()中,我们对形参s进行了重新创建和赋值,并没有修改传进来的实参。因此,在执行完changeString()函数后,实参s所指向的对象仍然是“hello”,而不是“world”。

如果想要在函数内部修改对象的属性,可以避免这种错误。例如:

public class Test {

    public static void main(String[] args) {

        StringBuilder s = new StringBuilder("hello");

        replaceString(s);

        System.out.println(s);

    }

    public static void replaceString(StringBuilder s) {

        s.replace(0, 5, "world");

    }

}

输出结果为:

world

(2)将值传递的参数当成引用传递的参数使用。

如果将值传递的参数当成引用传递的参数使用,就会出现错误。例如:

public class Test {

    public static void main(String[] args) {

        int a = 5;

        changeValue(a);

        System.out.println(a);

    }

    public static void changeValue(int x) {

        x += 1;

    }

}

输出结果为:

5

这个结果和值传递的结果一样。这是因为我们定义的是值传递的参数,而不是引用传递的参数。如果想要使用引用传递,需要使用对象类型的参数。

总结:

Java函数的参数传递方式有两种:值传递和引用传递。在使用这两种传递方式时,需要注意他们的不同之处和常见错误。通过学习Java参数传递方式和常见错误,我们可以更好地理解函数的调用机制,避免在程序编写中出现错误。