Java是引用传递还是值传递?

Java中的传递方式一直是一个混淆点,许多人认为Java是按值传递,也有人坚持认为Java是按引用传递。实际上,Java采用的是值传递的方式,但是对于引用类型的变量,其值是对象的引用,这也导致了一些误解。

首先:

值传递是指在方法调用时,将实际参数的值复制给形式参数,即在方法内部对形式参数的修改不会影响到实际参数的值。这意味着方法中对形式参数的修改只影响到了方法内部的局部变量,不会影响到方法外部的变量。

引用传递是指在方法调用时,将实际参数的引用(地址)复制给形式参数,形式参数和实际参数指向同一个内存地址,所以对形式参数的修改会影响到实际参数的值。

在Java中,基本数据类型(如int、float、boolean等)是按值传递的,而引用类型(如数组、对象)也是按值传递的,但是需要注意的是,引用类型的值是对象的引用。

其次:

我们看下面这个例子:

public class Main {
    public static void main(String[] args) {
        int number = 10;
        System.out.println("Before method call: " + number);
        modifyValue(number);
        System.out.println("After method call: " + number);
    }
    
    public static void modifyValue(int value) {
        value = 20;
    }
}

上面的代码中,我们定义了一个整型变量number并赋值为10。然后我们调用了modifyValue方法,并将number作为实际参数传递给了value形式参数。在modifyValue方法内部,我们修改了value的值为20。然后我们打印出方法调用前后number的值。

输出结果如下:

Before method call: 10
After method call: 10

可以看到,尽管在方法内部修改了value的值,但是并没有影响到number的值。这表明Java中的基本数据类型是按值传递的,方法内部对形式参数的修改不会影响到实际参数。

接下来,我们再通过一个例子来说明Java中引用类型的传递方式:

public class Main {
    public static void main(String[] args) {
        int[] array = {1, 2, 3};
        System.out.println("Before method call: " + array[0]);
        modifyArray(array);
        System.out.println("After method call: " + array[0]);
    }
    
    public static void modifyArray(int[] arr) {
        arr[0] = 100;
        arr = new int[]{4, 5, 6};
    }
}

在上面的代码中,我们定义了一个整型数组array并初始化为{1, 2, 3}。然后我们调用了modifyArray方法,并将array作为实际参数传递给了arr形式参数。在modifyArray方法内部,我们先将arr的第一个元素修改为100,然后将arr重新赋值为新的数组{4, 5, 6}。然后我们打印出方法调用前后array[0]的值。

输出结果如下:

Before method call: 1
After method call: 100

可以看到,尽管在方法内部修改了arr的第一个元素为100,这个修改也影响到了array,使得array[0]的值变为100。这表明Java中的引用类型是按值传递的,但是对于引用类型的变量,其值是对象的引用。因此,通过引用可以修改所指向的对象的状态,这种修改是可以在方法外部看到的。

然而,在modifyArray方法内部重新给arr赋值一个新的数组后,并不会影响到方法外部的array。这是因为在方法内部,arr引用指向了一个新的数组对象,但是这个改变不会影响到方法外部的array引用,它仍然指向原来的数组对象。

综上所述,Java中的传递方式是按值传递。对于基本数据类型,方法内部对形式参数的修改不会影响到实际参数;而对于引用类型,方法内部对形式参数的修改可以影响到所引用的对象的状态,但是重新给形式参数赋值并不会影响到实际参数所引用的对象。

黑马程序员Java零基础视频教程_上部(Java入门,含斯坦福大学练习题+力扣算法题和大厂java面试题)
黑马程序员Java零基础视频教程_下部(Java入门,含斯坦福大学练习题+力扣算法题和大厂java面试题)
 

猜你喜欢

转载自blog.csdn.net/Itmastergo/article/details/132401959