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

Java到底是值传递还是引用传递?,第1张

前言

直接斩钉截铁地说Java是值传递的有点不太合适,这里我给出自己的看法。

c语言的按引用传递

在C语言中是可以按引用传递的,我们可以在方法中接收外部参数,实参使用&地址符来表示需要按引用传递,这样我们在方法中就可以通过*+参数名来修改外部的变量。

代码实例:

#include 

void fun(int* a);
 
int main()
{
    int a = 1;
    printf("%d\n", a);
    fun(&a);
    printf("%d\n", a);
    return(0);
}

void fun(int* a)
{
    *a = 2;
}

运行结果:

1
2

我们可以发现在c语言可以在方法中改变外部的变量值,而在java中是没有*&这种地址引用的语法的。在java的方法中我们只能外部的对象属性或者数组中的元素,而不能直接改变外部变量的引用。

所以从这个角度来看,Java只有值传递没有引用传递。

Java中的值传递

在Java中,什么是引用呢?当我Dog dog = new Dog()的时候,栈中的dog变量指向了堆中的Dog对象,此时局部变量dog就是堆中对象Dog的引用。

在方法的参数我们可以接收Dog类型的变量,也就是说可以按引用传递,严格得说应该是引用的值,因为我们无法在方法中去改变外部的引用,比如下面代码:

public class Dog {
    public static void main(String[] args) {
        Dog dog = new Dog();
        System.out.println("dog " + dog);
        fun(dog);
        System.out.println("dog " + dog);
    }

    public static void fun(Dog dog) {
        dog = new Dog();
    }
}

运行结果

dog Unknown.Dog@6e0be858
dog Unknown.Dog@6e0be858

在执行fun()的时候,参数因为是值传递,会在栈重新创建一个变量形参_dog来指向堆,在方法中的dog = new Dog();改变的只是形参的引用,而实参也就是外部的dog变量并没有被改变,因为Java中没有指针的概念,不能像C那样使用&&来通过指针改变实参的引用。

为什么有人说是按引用传递的

这时候我们把c语言忽略掉,只看Java。在Java的引用是什么呢,栈中变量指向堆中对象。

此时的按值传递就是,传递基本类型变量:

int a = 10;
fun(a);

此时的引用传递就是,传递引用类型变量:

String a = "滕青山";
fun(a);
总结

从跟C语言的按引用传递比较的角度来看,Java只有值传递;

从Java的基本类型变量和引用类型变量的角度来看,Java既可以值传递也可以引用传递。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/917804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存