java的值传递和引用传递

java本质上只有值传递,没有引用传递

java中我们说的引用传递只是把地址当作值传递给了另一个变量,然后这个变量根据这个地址值在栈中对对象的属性值进行修改,看个例子:

public class JavaTest {
    public static void main(String[] args) {
        JavaTest javaTest = new JavaTest();
        javaTest.first();
    }
       public void first(){
        int i = 5;
        Num num = new Num();
        num.i = 25;
        second(num,i);
        System.out.println(num.i);
    }
    public void second(Num num1,int i){
        i = 0;
        num1.i = 20;
        Num num2 = new Num();
        num1 = num2;
        System.out.println(num1.i + "  " + i);
    }
}
class Num{
    int i = 15;
}

这个题的输出结果是

15  0
20

先看这一步

    public void first(){
        int i = 5;
        Num num = new Num();
        num.i = 25;
        second(num,i);
        System.out.println(num.i);
    }

首先new了一个Num对象(Num num = new Num();)
在这里插入图片描述

然后通过num中存储的地址,在栈中找到对应的i进行了更改(num.i = 25;)
在这里插入图片描述

调用second方法并带入参数(second(num1,i);)
ps:方法区就不画了,主要说传递问题

public void second(Num num1,int i){
        i = 0;
        num1.i = 20;
        Num num2 = new Num();
        num1 = num2;
        System.out.println(num1.i + "  " + i);
    }

这时候num1中地址和num中的地址相同,但堆中num这个变量依然存在,i也一样,只不过在second中定义的i初始值就是传过来的值
ps:之前忘了画i了,现在补上
在这里插入图片描述

下面进入second方法

i = 0;

在这里插入图片描述

num1.i = 20;

在这里插入图片描述

Num num2 = new Num();
num1 = num2;

这时新建了一个num2,并将num2的地址赋值给了num1,num中的地址值没有变化
在这里插入图片描述

这个时候打印
在这里插入图片描述

System.out.println(num1.i + "  " + i);

根据图我们都可看出num1.i=15,i=0

second方法结束,该出栈的出栈
在这里插入图片描述
回到方法first

public void first(){
        int i = 5;
        Num num = new Num();
        num.i = 25;
        second(num,i);
        System.out.println(num.i);//此时该执行这句
    }

在这里插入图片描述
基本类型不一定直接存在栈中,这么画只是为了好理解这道题,详情请看https://blog.csdn.net/qq_37272886/article/details/112316160

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值