值传递和引用传递,方法的内存原理

值传递和引用传递

这两个词是java很核心的概念。 很多新手一直不理解值传递和引用传递,老是被这两个概念绕晕。

首先最重要的哪些是值传递: 常见的基本数据类型 比如 byte short int double。。。。
哪些是引用传递:除基本类型之外的绝大部分 引用类型 比如方法 对象 接口 数组

先来看2个例子:

public class ReferencingDatatype {
    public static void main(String[] args) {
        int a =10;
        addMethod(a);
        System.out.println(a);


        Student student = new Student();
        student.setRanking(10);
        addMethod3(student);
        System.out.println(student.getRanking());
    }

    private static void addMethod3(Student student) {
        student.setRanking(20);
    }
    
    private static void addMethod(int a) {
        a=20;
    }
}

对于第一个变量 a ,我们在方法里面 给他变一下 变成20
但是打印出来发现 a 依然是 10!

这是为什么 因为值传递 传递的是该值的副本, 在java的内存模型 中 方法的执行 是栈在控制,
每个方法将要被执行的是 就准备入栈 执行完之后就会出栈。

上面的代码中 main主方法先入栈 接着开始执行addMethod方法 于是这个方法入栈 这时候它的参数中有a 变量a就把他的值的副本传给方法 意味着 复制了一个10 给方法 这个10 和原来的a 就没有什么关系了。


然后再看第二个 Student 类创建出一个对象 student :属性ranking 是10
在方法中给他的属性ranking 变一下 变为20 打印出来发现 student.getRanking() 是20 发现已经改变了
这就是引用传递, 在java的内存模型中 对象是创建在堆上面, 堆是一块内存区域,他的引用的值是堆上的内存地址 打个比方 比如0001
所以我们把引用student 传给方法时 方法根据这个0001地址 去找到堆上的 student对象,
他做了改变 堆上的对象的值也就改了

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值