为什么说Java对象引用传参是按值调用的

学过C++都知道到指针,而学Java就会知道Java就没有指针概念。

Java在函数传参时会发现Java方法在没返回值情况下可能无法达到预期的效果。
例如

Java
//将两个对象互换
public class Expelor {
	public static void main(String[]arge) {
	//创建两个Empee实例对象
		Empee firstMan=new Empee("marry", 100);
		Empee secondMan=new Empee("jrry",1000);
		Expelor e=new Expelor();
		//调用交换方法
		e.swap(firstMan, secondMan);
		System.out.println(firstMan.getName()+"   "+firstMan.getSlary());
  		System.out.println(secondMan.getName()+"   "+secondMan.getSlary());
	}
	//交互值函数
	private void swap(Empee a,Empee b) {
		Empee newONe=a;
		a=b;
		b=newONe;
	}
}
//创建一个基本对象Empee
class Empee{
	private String name;
	private long  slary;
	public Empee(String name,long slary) {
		this.name=name;
		this.slary=slary;
		System.out.println(name+"薪酬是"+slary);
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public long getSlary() {
		return slary;
	}
	public void setSlary(long slary) {
		this.slary = slary;
	}

}
结果是
marry薪酬是100
jrry薪酬是1000
marry   100
jrry   1000

从而发现其没有实现对Empee两个实例化对象进行交换。
这是为什么那?
因为a,b虽然交换前分别指向firstMan,和SecondMan,但是作为局部变量在程序执行完swap函数之后,a,b就被程序释放回收了。
图示如下
在这里插入图片描述
在这里插入图片描述
这个Java用对象引用却没有改变。
代码执行可见

Java
public class Expelm {
	public static void main(String[]arge) {
		Empee firstMan=new Empee("marry", 100);
		Empee secondMan=new Empee("jrry",1000);
		Expelm e=new Expelm();
		//打印初始对象
		System.out.println(firstMan);
		System.out.println(secondMan);
		e.swap(firstMan, secondMan);
		//打印执行之后对象
		System.out.println(firstMan);
		System.out.println(secondMan);
	}
	private void swap(Empee a,Empee b) {
		Empee newONe=a;
		a=b;
		b=newONe;
		//打印a,b执行后对象
		System.out.println(a);
		System.out.println(b);
	}
}
结果是
//打印初始对象
dome.Empee@311d617d
dome.Empee@7c53a9eb
//打印a,b执行后对象
dome.Empee@7c53a9eb
dome.Empee@311d617d
//打印执行之后对象
dome.Empee@311d617d
dome.Empee@7c53a9eb

然而

Java
//薪酬进行改变变成三倍
public class Expelm {
	public static void main(String[]arge) {
	//创建一个Empee实例进行薪酬提升
		Empee firstMan=new Empee("marry", 100);
		Expelm e=new Expelm();
		e.highSalry(firstMan);
		System.out.println(firstMan.getName()+"   "+firstMan.getSlary());
	}
	//薪酬提升方法函数
	void highSalry(Empee a) {
		a.setSlary(a.getSlary()*3);
	}
}
class Empee{
	private String name;
	private long  slary;
	public Empee(String name,long slary) {
		this.name=name;
		this.slary=slary;
		System.out.println(name+"薪酬是"+slary);
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public long getSlary() {
		return slary;
	}
	public void setSlary(long slary) {
		this.slary = slary;
	}
}
-------------------------------------------------------------------------------------------
结果是
marry薪酬是100
marry   300

明显通过该方法将实例化对象薪酬乘3
在这里插入图片描述
所以Java是按照值传递数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值