我在这里上课:
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()
功能正常工作。我知道这是关于通过引用传递对象但不确定如何修复它的一些问题。有人请帮忙。
答案 0 :(得分:3)
你的问题是java通过VALUE而不是引用。所以你不能像你那样写交换函数。
你可以做点什么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的范围内进行交换。
答案 1 :(得分:2)
你有两个名为cat1和cat2的change()参数和类变量。如果你重命名一套,我想你会看到发生了什么。如果没有,请发表评论。
答案 2 :(得分:0)
您有范围问题。
每个方法都将其参数定义为自己的引用。传入的值将分配给方法签名中定义的引用。方法签名本质上是一个局部变量的声明,在调用方法时赋值。其他答案的意思是'按值传递'。
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
变量。