可能重复:
我这里有一节课:
public class Cat {
private String catNum;
private static Cat cat1;
private static Cat cat2;
public Cat(String catNumber) {
catNum = catNumber;
}
public static void change(Cat cat1, Cat cat2) {
Cat temp = cat1;
cat1 = cat2;
cat2 = temp;
}
public String toString() {
return "cat number: " + catNum;
}
public static void main(String[] args) {
cat1 = new Cat("1");
cat2 = new Cat("2");
System.out.println("cat1=" + cat1);
System.out.println("cat2= " + cat2);
change(cat1, cat2);
System.out.println("cat1=" + cat1);
System.out.println("cat2= " + cat2);
}
}我想让change()函数正常工作。我知道这是关于通过引用传递对象的一些问题,但不确定如何修复它。谁来帮帮忙。
发布于 2011-09-15 20:02:03
您的问题是java是通过值传递的,而不是引用。因此,您不能像以前那样编写交换函数。
你可以做这样的事
class CatContainer {
Cat cat1;
Cat cat2;
CatContainer(Cat cat1, Cat cat2) {
this.cat1 = cat1;
this.cat2 = cat2;
}
...
}然后有一个方法
public static void swapCatsInContainer(container) {
Cat tmp = container.getCat1();
container.setCat1(container.getCat2());
container.setCat2(tmp);
}差不多是这样的。现在,在称为swapCatsInContainer、cat1和cat2的范围内进行交换。
发布于 2011-09-15 20:01:11
您拥有名为cat1和cat2的change()参数和类变量。如果你重新命名一套,我想你会看到发生了什么。如果没有,请删除评论。
发布于 2011-09-15 22:53:39
你的范围有问题。
每个方法都将其参数定义为它们自己的引用。传入的值分配给方法签名中定义的引用。方法签名本质上是在调用方法时被赋值的局部变量的声明。这就是其他答案所指的“通过价值传递”。
private static Cat cat1; // < this cat1 and cat2 are
private static Cat cat2; // never referred to
public static void change(Cat cat1, Cat cat2) {
Cat temp = cat1; // ^ ^
cat1 = cat2; // < cat1--' |
cat2 = temp; // < cat2 means------'
}如果有帮助的话,你可以这样想:
// pseudo code
method change() {
Cat cat1 = method.Argument[0];
Cat cat2 = method.Argument[1];
...
}通过写入cat1和cat2,您只需写入定义为方法签名一部分的局部变量。您没有写入相同名称的静态作用域变量。
要使代码正常工作,可以显式引用静态值。
public static void change(Cat cat1, Cat cat2) {
Cat.cat1 = cat2; // cat1 and cat2 are static
Cat.cat2 = cat1; // i.e. defined on the class
}或者你可以给他们重新命名。
public static void change(Cat c1, Cat c2) {
cat1 = c2;
cat2 = c1;
}或者,由于它们是静态的,所以可以完全取消方法参数。
public static void change() {
Cat temp = cat1;
cat1 = cat2;
cat2 = temp;
}注意,只有最后一个仍然需要temp变量。
https://stackoverflow.com/questions/7436761
复制相似问题