Java基础-参数传递问题

在上一篇中,简单的介绍了堆和栈,这一篇再接着来巩固下

抛出问题:Java中的到底是值传递还是引用传递?(面试题)


基本数据类型的传递

public class DemoArray {
	
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		System.out.println("main a:"+a+",b:"+b);
		change(a,b);
		System.out.println("afterChange a:"+a+",b:"+b);
		
	}
	
	private static void change(int a, int b) {
		System.out.println("change a:"+a+",b:"+b);
		a = 30;
		b = 40;
	}
	
}

Output:
main a:10,b:20
change a:10,b:20
afterChange a:10,b:20

首先,main方法会入栈,分配了两个变量,int a 和 int b。后面调用了change方法,前一篇说过,每一个方法都是栈帧形式存在,所以change方法也会入栈,在其内修改a,b的值并不会影响到main方法中变量的值,最后change弹栈后回到main再打印a,b值,自然还是原来的值

总结基本数据类型的值传递,不改变原值,因为调用后就会弹栈,而其局部变量也会随之消失


引用数据类型的传递

public class DemoArray {
    
    public static void main(String[] args) {
        int[] arr = new int[] {1,2,3};
        System.out.println("main arr[1]:"+arr[1]);
        change(arr);
        System.out.println("afterChange arr[1]:"+arr[1]);
    }
    
    private static void change(int[] arr) {
        arr[1] = 5;
    }
    
}

Output:
main arr[1]:2
afterChange arr[1]:5

首先还是main方法进栈,在堆内存分配数组空间,当调用change方法时,会将其地址值传递过去,在change中修改的值为堆内存中的值,执行完毕后弹栈,然而在main中再次打印时,由于堆内存数据发生了改变,所以导致输出结果也改变了

总结:引用数据类型的值传递,改变原值。因为即使方法弹栈,但是堆内存数组对象还在,可以通过地址继续访问


讲了这么多,那么Java中到底是传值还是传引用呢?看了上面的两个概述,你可能会说基本数据类型传值,引用数据类型传引用,你可以在仔细看看那两句话的总结都是:xxx的值传递

首先,程序运行永远都是在JVM栈中进行的,因而参数传递时,只存在传递基本类型和对象引用的问题。不会直接传对象本身。

在运行JVM栈中,基本类型和引用的处理是一样的,都是传值,所以没有传引用,传引用方法的调用,可以理解为传引用值,就是地址值(感觉在玩了场文字游戏)

那么这个面试题答案也就很清楚了:java中只有传值,基本数据类型传递的是值,引用数据类型传递的是地址值



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值