【问题标题】:Java pass by reference issue [duplicate]Java按引用传递问题[重复]
【发布时间】:2011-09-15 19:57:55
【问题描述】:

可能重复:
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() 函数工作。我知道通过引用传递对象是一些问题,但不知道如何解决它。有人请帮忙。

【问题讨论】:

  • 欢迎来到 Stack Overflow!如所写,您的问题太模糊而无法回答。您希望该功能做什么?它现在做什么?你都尝试了些什么?您提供的详细信息越多,付出的努力越多,我们就越有可能为您提供帮助。
  • 你不能。请参阅:Java is Pass-by-Value, Dammit!

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


【解决方案1】:

你的问题是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 交换了。

【讨论】:

  • 严格来说,您是按值传递引用
  • @ratchet 对,也就是说你是按价值传递的。没有必要用引用这个词把事情复杂化。
  • 棘轮,虽然这是旧帖子,但您的评论(按值传递引用)救了我。
【解决方案2】:

您既有 change() 参数,也有名为 cat1 和 cat2 的类变量。如果你重命名一组,我想你会看到发生了什么。如果没有,请发表评论。

【讨论】:

  • 或者在引用全局变量时至少使用 this.catx。
  • 或引用静态成员变量时的 ClassName.catx。
【解决方案3】:

你的范围有问题。

每个方法都将其参数定义为它们自己的引用。传入的值被分配给方法签名中定义的引用。方法签名本质上是局部变量的声明,在调用方法时这些变量被赋值。这就是其他答案“按值传递”的含义。

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

【讨论】:

    猜你喜欢
    • 2015-07-19
    • 2013-12-02
    • 2012-03-12
    • 2013-09-15
    • 2016-01-27
    • 2012-03-13
    • 2014-09-10
    • 2015-12-08
    • 2011-05-16
    相关资源
    最近更新 更多