java引用传递和值传递

public class Test
{
public static void main(String[] args)
{
Point p1 = new Point(0,0);
Point p2 = new Point(0,0);

modify(p1, p2);
System.out.println(p1.getX()+","+p1.getY()+","+p2.getX()+","+p2.getY());
}

private static void modify(Point p1,Point p2){
Point p = p1;
p1 = p2;
p2 = p;
p1.setLocation(5, 5);
p2 = new Point(5, 5);
}
}
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;
}
public void setX(int x){
this.x = x;
}
public int getX(){
return x;
}
public void setY(int y){
this.y = y;
}
public int getY(){
return y;
}
}

为什么结果是0,0,5,5
能不能具体的说一下,以栈内存和堆内存的角度

结果是(p1[0,0], p2[5,5])就对了, 下图是执行流程以及内存变化


 记住: 当对象的引用被执行赋值操作(=)后, 讲不在指向原来的对象(新的对象不是原来的对象)



// modify方法做如下修改就知道为什么是那样的结果了:
    private static void modify(Point p1,Point p2){
        System.out.println(p2); // 注意观察hashcode值, 不要重写toString()方法
        Point p = p1;
        p1 = p2;
        p2 = p;
        p1.setLocation(5, 5);
        p2 = new Point(5, 5);
        System.out.println(p2); // 这里p2与之前的p2的hashcode值已经不是同一份
    }
    
// 修改main方法如下
    public static void main(String[] args)
    {
        Point p1 = new Point(0,0);
        Point p2 = new Point(0,0);
        System.out.println(p2);
        modify(p1, p2);
        System.out.println(p2);    // modify执行完成后, p2的指向并未改变
        System.out.println(p1.getX()+","+p1.getY()+","+p2.getX()+","+p2.getY());
    }
    
    /**
    * 可以使用断点调试观察modify方法中p2的指向变化
    * Eclipse中引用被赋予新的值时, 调试界面中[变量列表]的变化为 黄色高亮显示
    */

希望对你有帮助!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-08-20
java中说的引用传递中的参数类似于c++中的指针,你把p1,p2想象成分别指向两块地址a,b的指针。
注意:modify方法中的p1和p2是main函数中的复制,而不是main函数中p1和p2本身

Point p = p1;此时p,p1都指向a。
p1 = p2;此时p1和p2指向b,p指向a。

p2 = p; p,p2指向a,p1指向b。

p1.setLocation(5, 5); b的x,y分别为5,5。

p2 = new Point(5, 5); p2指向了另一块内存地址。

方法结束,再回到main函数,main函数中的p1还是指向a,p2还是指向b,a是(0,0),b是(5,5)
就是你那个输出了本回答被网友采纳
第2个回答  2014-08-20
Java中没有指针,所以也没有引用传递了
第3个回答  2014-08-20
其实主要是看 参数列表声明中参数名的属性
引用的意义是起个别名 其本身指的就是实际传入的那个参数地址 这和c++中指针功能是相近的
而按照值传递 是传递一个参数副本进去 也就说这个副本必是非地址型的变量

正如zhuifeng6464 所说,

如果参数以8大基本数据类型定义的 则为按值传递,如果参数以类名或某个引用类型的变量定义的则为按引用传递.-------------摘的

基本数据类型 变量是存储方式是比较精简的,而对于复杂数据类型 诸如class定义的类的对象 那么那对象名所指的虽然是该对象存储的首地址 而其存储方式上则相对复杂庞大

而函数本身的参数列表基于存储空间的限制 是不支持复杂的数据结构这种存储方式(因为他太浪费空间了)的,那么作为复杂数据类型的传递 只能以地址 有就是引用的方式存在,

这个是我个人的理解追问

所以我认为上述程序中都是引用传递,结果应该为5,5,5,5啊。为什么p1的x,y值没有改变呢

相似回答