Java值传递问题

Java都是值传递 不存在所谓的引用传递

为什么这么说呢,看下定义就知道了
引用传递: 指调用函数时传递的参数是引用类型(不是基本类型)的时候值是引用类型的参数的实际地址直接传递到函数中,函数对参数直接进行修改的话,将影响到实际参数;
值传递: 是指调用函数时直接将实际参数复制一份传递到函数中,这样再函数中再怎么对参数进行修改也不会对外面的实际参数造成影响
所以说实际上都是传递的值,只是引用传递传递的值是引用类型的参数的地址

形参类型(值类型和引用类型)

首先我们要明白值传递和引用传递实际是对函数调用时求值和传值的描述方式,并不代表传递时参数的类型(值类型和引用类型)
值类型和引用类型的差异: 值类型(也就是Java的基本类型)是直接在栈上分配内存的,而引用类型则是在堆上分配的

1.两个类型的变量会有不同:

int num = 10;
String str = "hello";

在这里插入图片描述

num是基本类型,就直接保存在变量中,而str是引用类型,实际上保存的"hello"对象的地址

2.=号赋值操作的差异:

num=20;
str = "java";

在这里插入图片描述

基本类型会直接覆盖掉原来的值,而引用类型则是用新的对象的地址去覆盖保存的上一个对象的值,但前一个对象并不会改变,而是等待垃圾回收器来将它回收(因为已经没有任何对象引用它了)

看几个实例:
相信在牛客网刷Java题的都碰到过类似的题

public class ValueTest {
    public static void change(int v){
        v = 66;
        System.out.println("函数中修改后的v:"+v);
    }

    public static void change(String s){
        s = "hello";
        System.out.println("函数中修改后的s:"+s);
    }

    public static void change(StringBuilder sb){
        sb.append(" world");
        System.out.println("函数中修改后的sb:"+sb.toString());
    }

    public static void main(String[] args) {
        int value = 1000;
        String s = "world";
        StringBuilder stringBuilder = new StringBuilder("Hello");
        change(value);
        change(s);
        change(stringBuilder);
        System.out.println(value);
        System.out.println(s);
        System.out.println(stringBuilder);

    }
}

输出:


函数中修改后的v:66
函数中修改后的s:hello
函数中修改后的sb:Hello world
1000
world
Hello world

首先,我们要知道,参数传递基本上就是赋值操作,也就是,方法调用的时候都是新创建了一个变量,然后将实际参数的值赋给了形参

所以可以看到只有第三个真正修改了实际参数原来的值,因为第三个方法是函数对参数直接进行了修改
分析:
第一个方法传递的是基本类型的值,所以是直接拷贝了实际变量,在函数中操作的的是副本值,和实际参数并没有关系
第二个方法虽然是对引用类型进行的操作,但是并没有对参数进行直接操作,相当于对一个新的引用类型进行了赋值操作,所以实际参数地址处的值并没有变化
第三个方法是直接对参数进行了修改
在这里插入图片描述
执行sb.append(" world")之后
在这里插入图片描述
根本原因:
所以在值传递的时候,都会在调用栈上创建一个副本,不同的是,由于值类型本身就在栈上,所以会直接得到整个的副本,而引用类型在堆上分配的空间,栈上只有一个它的引用,所以创建副本也只能创建这个引用的副本,所以上面提到对引用类型本身直接进行操作的话会影响到实际参数的值,因为直接操作相当于直接在堆上找到了实际参数的地址,对那处地址进行了修改;而值类型则直接操作是副本对象,与实际参数没有关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值