Java基础-值传递和引用传递的差别

方法的调用和参数的传递

在java中,经常需要调用其它方法,而当调用的方法有参数时,我们就需要传递参数,传递的参数又分为值传递和对象引用传递

package test
class Test{
	void methodA(){
		int i = 1;
		Integer integer = 10;
		// 调用methodB方法,i是值的传递,integer是引用的传递  
		methodB(i, integer);
	}
	
	/*
	* 被调用的方法1
	*/
	void methodB(int i, Integer integer){
		System.out.println("i:" + i);
        System.out.println("integer:" + integer);
	}

	// main方法
	public static void main(String[] args){
		Test t = new Test();
		t.methodA();
	}
}

运行结果:
在这里插入图片描述

值传递

在java中,传递的参数为基本类型时,是值的传递

为什么基本类型是值传递呢?首先,我们要知道,java定义的基本类型被存储在栈中,在传递参数时,先定义一个要被传递的参数,拿上面的 int i = 1来说,需要在栈内存空间中开辟一小块空间用来存储这个值1,而传递参数时,将这片空间拷贝了一份,赋值给方法的形参,所以基本类型都是值传递。
值传递
由于methodB中的参数i指向一个新的内存空间,所以不论methodB中的参数i如何变化,都无法改变methodA中变量i的值。

引用传递

传递的参数为对象时,是引用的传递,这是因为对象的存储是在堆内存中,而栈内存中只保存对象在堆内存中的地址。

画图演示:
引用传递
可以看出,在传递对象参数时,是将堆内存中指向对象实际位置的地址复制了一份,因为两个方法中的地址引用相同,他们指向了同一个内存空间,所以当其中一个方法改变栈内存中的值时,两个方法中的值都会发生变化

package test;

import java.lang.reflect.Field;

/**
 * @author miao
 * @date 2020/8/1
 */
public class Test {
    void methodA(){

        Integer integer = 10;

        System.out.println("方法A修改前:" + integer);
        // 调用methodB方法
        methodB(integer);

        System.out.println("方法A修改后:" + integer);
    }

    /*
     * 被调用的方法
     */
    void methodB(Integer integer) {
        System.out.println("方法B修改前:" + integer);

        // 因为Integer是final修饰的,所以我们用反射强行修改它的值为1
        try {
            Class<? extends Integer> clazz = integer.getClass();
            Field value = clazz.getDeclaredField("value");
            value.setAccessible(true);
            value.set(integer, 1);
        } catch (Exception e) {

        }


        System.out.println("方法B修改后:" + integer);
    }

    public static void main(String[] args){
        Test t = new Test();
        t.methodA();
    }
}

运行结果:
在这里插入图片描述
可以看到,方法A没有操作integer的值,但是它的值依然被修改了。

刚开始写java的博客,本着学习的态度和大家分享,有什么不足或对java知识理解错误的地方请大家指出,共同交流学习和进步。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值