我要说的和你上面的题目没有太大关系。但是: 从你编写的程序来看,你对oop的认识有些问题,对象的引入,目的之一就是数据的封装。在我看来,数据的封装并不仅仅是对数据的访问进行了控制(public or private),而更重要的是将一系列相关数据整合在了一起(某个class就好像是关系型数据库中某张表,而这个class的某个实例就是这张表的一条记录)。你现在想达到的目的,就好像要求数据库在原来a记录的位置放上记录b,而把a放到b上面去。而这两条记录没有发生任何变化。这样做,我认为是没有任何意义的。因为我们是数据本身,而非数据存放的位置,或者这个对象的名称。正确的做法(或许)是改变某条记录中的字段也就是某个对象中的成员变量。而唯一需要关心具体数据存放位置的地方,是这些数据存放的地方本身。比如class Office { //在这里,您或许会需要把他们彼此作为一个整体进行交换 Employee boss, worker; public Office(Employee a, Employee b) { this.boss = a; this.worker = b; } public void doSwap() { Employee temp = worker; worker = boss ; boss = temp; } }class Test { public static void main(String[] args) { Employee a = new Employee(); Employee b = new Employee(); //在这里,直接交换a,b是可以的,但是传递给某个方法,比如 swap(a,b); //进行位置交换,显然没有意义 Office o = new Office(a, b); o.doSwap(); } public static swap(Employee a, Employee b) { //在这里,应当关心的是a或者b里面存放的数据,比如姓名,薪水。 a.salary ^= b.salary; b.salary ^= a.salary; a.salary ^= b.salary; //而非数据存放的位置。 } }不好意思,我说的太乱,没能正确表达我的想法。而且,这只是我的一家之言,或有错漏,还望各位一笑以弊之
Employee temp = x;
x = y;
y = temp;
http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
以前有网友发过这个:
http://www.javaranch.com/campfire/StoryPassBy.jsp
用cup做比喻的也很不错
Employee temp=null;
temp=a;
a=b;
b=temp;
根本用不着什么swap()方法
从你编写的程序来看,你对oop的认识有些问题,对象的引入,目的之一就是数据的封装。在我看来,数据的封装并不仅仅是对数据的访问进行了控制(public or private),而更重要的是将一系列相关数据整合在了一起(某个class就好像是关系型数据库中某张表,而这个class的某个实例就是这张表的一条记录)。你现在想达到的目的,就好像要求数据库在原来a记录的位置放上记录b,而把a放到b上面去。而这两条记录没有发生任何变化。这样做,我认为是没有任何意义的。因为我们是数据本身,而非数据存放的位置,或者这个对象的名称。正确的做法(或许)是改变某条记录中的字段也就是某个对象中的成员变量。而唯一需要关心具体数据存放位置的地方,是这些数据存放的地方本身。比如class Office { //在这里,您或许会需要把他们彼此作为一个整体进行交换
Employee boss, worker;
public Office(Employee a, Employee b) {
this.boss = a; this.worker = b;
} public void doSwap() {
Employee temp = worker; worker = boss ; boss = temp;
}
}class Test {
public static void main(String[] args) {
Employee a = new Employee(); Employee b = new Employee();
//在这里,直接交换a,b是可以的,但是传递给某个方法,比如
swap(a,b);
//进行位置交换,显然没有意义 Office o = new Office(a, b);
o.doSwap();
} public static swap(Employee a, Employee b) {
//在这里,应当关心的是a或者b里面存放的数据,比如姓名,薪水。
a.salary ^= b.salary; b.salary ^= a.salary; a.salary ^= b.salary;
//而非数据存放的位置。
}
}不好意思,我说的太乱,没能正确表达我的想法。而且,这只是我的一家之言,或有错漏,还望各位一笑以弊之
而唯一需要关心具体数据存放位置的地方,是这些数据存放的地方本身
指的是长期保存这些数据集(某个对象)的地方,也就是另外一个(更高级的)对象(比如office)中的成员变量。就好比另外一张表(Office类型)中的某条记录(某个Office实例)中的某(几)个字段(boss&worker)。而作为局部变量来说,你改变其指针只是会在当前方法内起作用。实在不要意思,说的乱七八糟,连自己也不知道在讲什么了
我比较叫真,改了改程序,这样做就行了,虽然麻烦点.public class ParamTest
{
public static void main(String[] args)
{System.out.println("\nTesting swap:");
Employee a = new Employee("Alice", 70000);
Employee b = new Employee("Bob", 60000);
System.out.println("Before: a=" + a.getName());
System.out.println("Before: b=" + b.getName());
swap(a, b);
//Employee temp = a;
//a= b;
//b = temp;
System.out.println("After: a=" + a.getName());
System.out.println("After: b=" + b.getName());
}
public static void swap(Employee x, Employee y)
{
Employee temp = new Employee();
//x = y;
//y = temp;
temp.setName(x.getName());
temp.setSalary(x.getSalary());
x.setName(y.getName());
x.setSalary(y.getSalary());
y.setName(temp.getName());
y.setSalary(temp.getSalary());
System.out.println("End of method: x=" + x.getName());
System.out.println("End of method: y=" + y.getName());
}
}class Employee
{public Employee()
{
name=null;
salary=0.0;
}
public Employee(String n, double s)
{
name = n;
salary = s;
}public String getName()
{
return name;
}public double getSalary()
{
return salary;
}public void setName(String aName)
{
name=aName;
}public void setSalary(double aSalary)
{
salary=aSalary;
}private String name;
private double salary;
}