java 对象引用 值引用_为什么说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就被程序释放回收了。

图示如下

965c5230d3f44f40f0015fa6b83c47a5.png

f92d1f6129a9244c3e15ee6e90af2693.png

这个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

2388457d0ceb262c678fe9a47534adaf.png

所以Java是按照值传递数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值