Java零基础学习08:方法的内存原理和值的传递

编写博客目的:本系列博客均根据B站黑马程序员系列视频学习和编写目的在于记录自己的学习点滴,方便后续回忆和查找相关知识点,不足之处恳请各位有缘的朋友指正。

一、方法调用的基本内存原理

图中所示就是java的虚拟机,其内存被分为五个部分,此阶段学习了解基本的栈和堆即可

 方法在运行时使用的内存依靠的就是栈,方法进栈运行,运行完毕就出栈;

堆则是指用户new出来的,在堆内存中开辟一个小空间

方法被调用时就会进栈,进入栈内存如上图所示

二、基本数据类型和引用数据类型

基本数据类型指的是左边四种,引用数据类型指的是除了左边四种之外的其它类型,一般是指new出来的类型,如数组

 这种存放于栈内存内部的方式就是基本数据类型的存放方式,而下图所示为引用数据类型的存放方式

 引用数据类型:当其变量内部存储的不是真实的数据值而是一个地址时,就称之为引用类型

三、方法的值传递

public class ArgsDemo01 {
    public static void main(String[] args){
        int number = 100;
        // 调用改变方法前
        System.out.println("调用改变方法前:" + number);
        Change(number);
        // 调用改变方法之后
        System.out.println("调用改变方法后:" + number);
    }

    public static void Change(int number){
        number = 200;
    }
}

运行这段代码,发现控制台的输出结果为下图,是不是感到很奇怪

其实这要从内存的角度来解释是很通俗易懂的

 因为方法的调用是进栈运行,运行结束则出栈,所以在运行过程中main方法中的number其实并没有被改变,所以打印出来的值均为100,总结起来就是传递基本数据类型时,传递的是真实的数据形参的改变,不影响实际参数的值

public class ArgsDemo01 {
    public static void main(String[] args){
        int[] arr  = {10,20,30};
        // 调用改变方法前
        System.out.println("调用改变方法前:" + arr[0]);
        Change(arr);
        // 调用改变方法之后
        System.out.println("调用改变方法后:" + arr[0]);
    }

    public static void Change(int[] arr){
        arr[0] = 200;
    }
}

运行上方这段代码发现这一次结果和第一次不同了

 惊喜的发现,这一次随着方法的调用,参数发生了改变,其实这是引用数据类型和基本数据类型的差异

 引用数据类型,在栈空间内是一个存储地址的变量,它所存储的地址指向的是堆空间内部的数值,当我们在被调用的方法中对其进行操作时,改动的是堆空间内部的数据,此时再对main方法中的数值进行打印输出,得到的自然是被改变后的数值

 因此得出的结论就是:传递引用数据类型时,传递的是地址值,形参的改变,影响实际参数的值

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值