在java中是按照值传递的,准确的说,值传递就是传递堆中的地址。
通过三个例子来了解一下值传递
例子一:
public class Apple {
public double height;
private String color;
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
public class Test {
public static void main(String[] args){
double a = 1.0;
double b = 2.0;
swap1(a,b);
System.out.println(a+" "+b);
}
public static void swap1(double x, double y){
double t = x;
x = y;
y = t;
}
}
运行结果:
分析:从内存指向的角度进行分析
double属于基本数据类型,基本数据类型其数值存在于栈。
例子二:
public class Test {
public static void main(String[] args){
Apple x1 = new Apple();
Apple x2 = new Apple();
x1.setHeight(1.0);
x2.setHeight(2.0);
swap2(x1,x2);
System.out.println(x1.height+" "+x2.height);
}
public static void swap2(Apple x, Apple y){
Apple t = x;
x = y;
y = t;
}
}
运行结果:
分析:从内存指向的角度进行分析
对象属于引用数据类型,在栈中存放对象的地址,在堆中存放对象的内容。
swap2方法入栈后开辟了一个新的空间,只交唤了x和y的内存地址,t的内存地址为999,仅是在堆中指向了地址为999的位置,什么都没做。
swap2方法出栈后,对main方法中的对象没有任何影响。
例子三:
public class Test {
public static void main(String[] args){
Apple x1 = new Apple();
Apple x2 = new Apple();
x1.setHeight(1.0);
x2.setHeight(2.0);
swap3(x1,x2);
System.out.println(x1.height+" "+x2.height);
}
public static void swap3(Apple x, Apple y){
double t = x.getHeight();
x.setHeight(y.getHeight());
y.setHeight(t);
}
}
运行结果:
分析:从内存指向的角度进行分析
swap3方法入栈后改变了堆中的height数值。