编写博客目的:本系列博客均根据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方法中的数值进行打印输出,得到的自然是被改变后的数值
因此得出的结论就是:传递引用数据类型时,传递的是地址值,形参的改变,影响实际参数的值