2011-09-15 144 views
1

可能重复:
Is Java pass by reference?的Java通过引用传递问题

我有这个类在这里:

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

+1

欢迎来到Stack Overflow!正如所写的,你的问题太模糊,无法回答。你想要什么功能?它现在做了什么?你试过什么了?你提供的细节越多,你展示的努力越多,我们就越有可能帮助你。 – templatetypedef

+6

你不能。请参阅:_ [Java是通过值,害羞!](http://javadude.com/articles/passbyvalue.htm)_ –

+0

是这个作业吗? – hvgotcodes

回答

2

您有两个change()参数和名为cat1和cat2的类变量。如果你重命名一套,我想你会看到发生了什么。如果不是,请删除评论。

+0

或至少在引用全局变量时使用this.catx。 –

+0

或ClassName.catx引用静态成员变量时。 –

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

要严格,你正在通过价值 –

+1

@ratchet权利,这就是说你正在传递的价值参考。无需使用单词引用使事情复杂化。 – hvgotcodes

+0

棘轮,而这是旧的帖子,你的评论(通过价值传递)救了我。 – Makketronix

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