Java中的值传递

1.引子:变量的赋值

对于基本数据类型

int m = 1;
int n = 2;
System.out.println("m = " + m);
System.out.println("n = " + n);
n = m;
System.out.println("n = " + n);

输出
m = 1
n = 2
n = 1

赋的值就是变量值。

对于引用类型

class User{
    int a;
}

User u1 = new User();
u1.a = 1;
User u2 = u1;
System.out.println("u1中的a为" + u1.a + "," + "u2中的a为" + u2.a);
u2.a = 2;
System.out.println("u1中的a为" + u1.a + "," + "u2中的a为" + u2.a);


输出
u1中的a为1,u2中的a为1
u1中的a为2,u2中的a为2

赋的值是地址值。

有同学可能会对第二个有疑问,这里我来画个简陋的内存解析来帮助理解一下。

在这里插入图片描述

5行代码,new了一个User对象,存放在堆空间中,a的初始值为0.而u1这个局部变量存储在栈中,u1的值为User对象的地址值0x3336行代码,u1修改了a的值,即a变成17行代码,栈中来了一个u2,将u1的地址值赋给了u2,所以u2的值也为0x3339行代码,u2修改了a的值,即a变成2

2.值传递机制

首先要明确,这个是主要体现在方法的调用上,也就是针对于方法中的形参与传递给它的实参而言。

方法中形参的传递机制:值传递

(1) 如果参数是基本数据类型,实参传递给形参的是真实存储的数据值

(2) 如果参数是引用类型,实参传递给形参的是地址值

举个例子,交换 a a a b b b 的值,有如下一 s w a p swap swap函数

void swap(int a,int b){
    int t = a;
    a = b;
    b = t;
}

如果此时调用该函数,能起到交换作用吗?

int x = 1;
int y = 2;
swap(x,y);

答案是不会的!这里还是拿简陋的内存图来解析一下
在这里插入图片描述

可以看出, s w a p swap swap 交换的仅仅只是它自己方法体内的参数,而不是 x x x y y y ,因为 a a a b b b 只是实参 x x x y y y 的是一个拷贝值。方法结束之后,它们就会被回收掉。

如果我再问,下面的 s w a p swap swap 函数,能起到交换作用吗?

void swap(User a, User b){
    User t = a;
    a = b;
    b = t;
}
User u1 = new User();
User u2 = new User();
swap(u1,u2);

class User{
    
}

答案依然是不会!

在这里插入图片描述

可以看到,我一顿操作,蓝色箭头丝毫没有受到影响。

那要怎么才能完成交换呢?这时候回到引子里面的对于引用类型的变量赋值,能找到一些答案。

void swap(int[] array,int a,int b){
    int t = array[a];
    array[a] = array[b];
    array[b] = t;
}

这样的一个交换函数,就能起到交换作用了!

int[] h = {1,2};
swap(h,0,1);
System.out.println(h[0] + "," h[1]);

输出
2,1

在这里插入图片描述

也就是说,一个方法不能修改一个基本数据类型的参数,但可以修改一个引用类型所指向的对象的状态

即传递引用类型的实参的话,形参会获得该实参的地址值,我们可以通过修改形参以达到修改实参的目的。

3.有意思的思考题

(1)

public class Test{
    public static void main(String[] args){
        int a = 10;
        int b = 20;
        method(a,b);//调用method方法后,仅打印出a=100,b=200
        System.out.println("a="+a);
        System.out.println("b="+b);
    }
    //代码编写处
    public static void method(int a,int b){
        
    }
}

(2)

int[] arr = {1,2,3};
System.out.println(arr);
char[] c = {a,b,c};
System.out.println(c);

输出
第二行输出:________
第四行输出:________

答案

(1)

public static void method(int a,int b){
    System.out.println("a=" + a*10);
    System.out.println("b=" + b*10);
    System.exit(0);
}

(2)

a r r arr arr的地址值

a b c abc abc

4.参考资料

(1) 尚硅谷_Java零基础教程-java入门必备-适合初学者的全套完整版教程(宋红康主讲)

(2) java基本数据类型传递与引用传递区别详解


更多Java内容欢迎扫码关注我的公众号ACJavaBear,文章第一时间会发在上面。一起学Java吧
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值