Java通过引用问题传递

时间:2011-09-15 19:57:56

标签: java pass-by-reference pass-by-value

  

可能重复:
  Is Java pass by reference?

我在这里上课:

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()功能正常工作。我知道这是关于通过引用传递对象但不确定如何修复它的一些问题。有人请帮忙。

3 个答案:

答案 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变量。