2011-09-15 156 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變量。