学过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是按照值传递数据。