java参数传递方式

本文深入探讨了Java中参数传递的机制,详细解释了如何通过传参改变非基本类型对象的状态,为何不能改变基本类型对象的值,以及为何无法通过传参使原有对象引用到新的对象。对于理解Java内存模型和提高编程效率具有重要意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.可以通过传参改变非基本类型对象的属性、状态

public class Test {
	public int b;
	public static void change(Test test)
	{
		test.b*=3;
	}
	public static void main(String[] args) {
		Test test=new Test();
		test.b=10;
		change(test);
		System.out.println(test.b);
	}
}

输出结果:
在这里插入图片描述

分析:非基本类型的对象的名字存储在栈中,值存储在堆中,当我们使用改变值的方法时,jvm会根据栈中存储的对象的地址在堆中找到这个对象,然后修改它的值,所以修改的就是实实在在的对象的值,而不是什么拷贝,因此可以通过传参改变非基本类型对象的属性、状态,这里的属性、状态指的是类中的成员变量,包括类中的基本类型和非基本类型的成员变量。

2.不可以通过传参改变基本类型对象(数值型或布尔型)的值

public static void change(int x)
	{
		x*=3;
	}

	public static void main(String[] args) {
		int a=5;
		change(a);
		System.out.println("a:"+a);
	}

输出结果:
在这里插入图片描述

分析:基本类型的对象的名字和值都存储在栈中,在执行改变值的方法时,相当于对原对象进行了拷贝,然后改变了拷贝出来的对象的值,原对象的值并没有改变,所以我们输出原对象当然值是不变的。

3.不可以通过传参让原有对象引用到新的对象

public class Test {
	public int b;
	public static void change(Test test1,Test test2)
	{
		Test temp=test1;
		test1=test2;
		test2=temp;
	}
	public static void main(String[] args) {
		Test test1=new Test();
		test1.b=5;
		Test test2=new Test();
		test2.b=3;
		change(test1,test2);
		System.out.println("test1:"+test1.b);
		System.out.println("test2:"+test2.b);
	}
}

输出结果:
在这里插入图片描述

分析:在调用方法进行交换之前,会生成两个对象的拷贝,进行交换的是两个对象的副本,也就是说,仅仅改变了两个对象的指向,并不会影响堆中对象的内容,也不会影响原本对象的指向,下图更好理解一些:

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值