请教一下java里的两个对象引用的交换是怎么实现的,C++里面的地址参数和java中的引用不一样吗?
class Person{
public String name;
public int age;
public Person(String tname ,int tage)
{
this.name = tname;
this.age = tage;
}
public Person(Person p)
{
this.name = p.name;
this.age = p.age;
}

public static void swap(Person p1,Person p2)
{
Person temp = p1;
p1 = p2;
p2 = temp;

}

public String toString()
{
StringBuffer strbuf = new StringBuffer();
strbuf.append(name).append("    ").append(age);
return strbuf.toString();

}
}public class Swap { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p1 = new Person("ling",20);
Person p2 = new Person("lang",25);
Person.swap(p1,p2);
System.out.println(p1);
System.out.println(p2); }}
我里面的swap是没有用的,谁能帮我解释下啊

解决方案 »

  1.   

    public Person(Person p)
    {
    this.name = p.name;
    this.age = p.age;
    }
    这个是模仿C++里边的拷贝构造函数?这个name是String对象的引用,相当于C++里边的指针,应该用深拷贝,浅拷贝有问题的。如果根据一个已存在的对象去复制一个拷贝,应该在类中实现Clonable接口,改写clone方法。public static void swap(Person p1,Person p2)
    {
    Person temp = p1;
    p1 = p2;
    p2 = temp;
    }
    同样的,这里p1,p2,temp都是引用变量,这里虽然交换了p1和p2的指向,但是main里边的p1和p2不受影响。尽管传的是地址,但是main和swap里边的p1、p2空间是不同的。
      

  2.   

    因为main里边的p1,p2是单向传递给swap里边的p1,p2的,因此一定要在swap里边交换的话只能考虑修改所指向对象的内容