先从一道面试题说起:
以下程序输出结果是什么:
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public void setLocation(int x, int y) {
this.x = x;
this.y = y;
}
private static void modifyPoint(Point p1, Point p2) {
Point tmpPoint = p1;
p1 = p2;
p2 = tmpPoint;
p1.setLocation(5, 5);
p2 = new Point(5, 5);
}
public static void main(String[] args) {
Point p1 = new Point(0, 0);
Point p2 = new Point(0, 0);
modifyPoint(p1, p2);
System.out.println("[" + p1.x + "," + p1.y + "],[" + p2.x + "," + p2.y + "]");
}
}
答案
[0,0],[5,5]
1、值与引用
为了纠正值传递和引用传递的一些误解,此处探讨的并不是值类型和引用类型,而是赋值操作时对各部分的名称。
以上面面试题为例,有 Point p1 = new Point(0, 0);
变量p1里存储着实际对象的地址,一般称这种变量为"引用",引用指向实际对象,我们称实际对象为该引用的值; 赋值操作符=实际上做的就是将引用指向值的地址的工作 ,如果我们有 p1 = new Point(3,3); 的话,情形就是这样: