在学习的时候你有没有发现一个问题:为什么调用方法时,传入的参数在调用方法之后,有时候会被改变,有时候却没有变?
一、值传递
对于基本数据类型,传递的是值,调用方法时,形参的改变不会影响实参,相当于把实参的值复制一份。
上例子:
public class Hello{
public static void main(String args[]) {
//a,b为实参: 实际存在的参数
int a = 10;
int b = 20;
arithm s = new arithm();
//调用方法
s.swap(a,b);
System.out.println("实参值:a = " + a + " b = " + b);
}
}
class arithm{
// 类中创建方法:swap用来交换a和b的值
public void swap(int a, int b){
//a,b为形式参数: 简单理解就是有效的存活时间就只在这一次swap方法调用中,
//当swap结束, 形参a,b所占用的内存空间就会被释放
int temp = a;
a = b;
b = temp;
System.out.println("形参值:a = " + a + " b = " + b);
}
}
结果:
1、方法调用是在栈空间里面开辟一块新的空间进行,首先进去的是main方法,再到swap方法,从图中可以看出形参的修改和实参是无关的,因为它们所处的空间都不一样,更别提修改实参了。
2、虽然形参和实参的名都是a、b,但是两者是不一样的,不要混淆了。
二、引用传递
引用类型传递的是地址,什么意思呢?拿数组arr[ ]举例,其地址假设是0x0011,作为参数传递过来的就是0x0011,表面它是个值,实质上是个地址,可以通过这个地址指向去影响实参。
上例子:
public class Hello{
public static void main(String args[]) {
//定义一个数组
int arr[] = {0,1,2};
arithm t = new arithm();
//调用方法
t.test(arr); //学过数组应该知道,数组名代表的是数组所在的内存地址
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i] + " ");
}
}
}
class arithm{
public void test(int arr[]){
//arr是数组(即引用类型),传进来的是地址,对其进行修改,修改的是该地址指向的内容
arr[0] = 5;
}
}
其实很简单的,只要记住基本数据类型传递的是值,不会修改实参;引用数据类型传递的是地址,对形参的修改会导致实参的修改。
本人正在B站跟着韩顺平老师学Java(非广告),所以做个笔记仅供学习,文章虽标为原创,但大体思路是韩顺平老师的授课思路,在此基础上加上了自己的理解,不喜勿喷哦。
各位宝子们如果觉滴还不错的话,可以点个赞 or 收个藏 or 打个赏哦,佛系博主一个。
好久没写文章了,有点生疏,会尽量抽出时间写的😂😂😂希望大家能体谅一个正在考研ing博主三天打鱼、两天晒网的行为哈哈哈😄