2011-09-15 4 views
1

가능한 중복 :
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() 기능 작업을 좀하고 싶습니다. 참조로 개체를 전달하는 방법에 대해서는 약간의 문제가 있지만 해결 방법은 확실하지 않습니다. 누군가 제발 도와주세요.

+1

스택 오버플로에 오신 것을 환영합니다! 서면으로, 당신의 질문은 대답하기에는 너무 모호합니다. 함수가 원하는 것은 무엇입니까? 그것은 지금 무엇을합니까? 지금까지 뭐 해봤 어? 귀하가 제공하는 세부 사항이 많을수록 더 많은 노력을 기울일수록 귀하를 도울 가능성이 높아집니다. – templatetypedef

+6

수 없습니다. 참조 : _ [Java는 Pass-by-Value, Dammit입니다.] (http://javadude.com/articles/passbyvalue.htm) _ –

+0

은이 숙제입니까? – hvgotcodes

답변

2

change() 인수와 cat1 및 cat2라는 클래스 변수가 모두 있습니다. 한 세트의 이름을 바꾸면 무슨 일이 일어나는지 보게 될 것입니다. 그렇지 않으면 주석을 삭제하십시오.

+0

또는 전역 변수를 refferening 할 때 최소한 this.catx를 사용하십시오. static 멤버 변수를 참조 할 때 –

+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

오른쪽에 의해 참조를 전달하고 있습니다. 단어 레퍼런스를 복잡하게 만들 필요가 없습니다. – hvgotcodes

+0

ratchet, 이것은 오래된 게시물이지만, 귀하의 의견 (가치에 의한 참조 전달)은 저를 구해주었습니다. – 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 변수가 필요하다는 점에 유의하십시오.