2014-02-07 2 views
2

이 주제를 읽었습니다 : Is Java "pass-by-reference" or "pass-by-value"?이 답변에서 예제를 실행하려고했습니다 : https://stackoverflow.com/a/73021/2838739. 사실이 메서드 외부에서 myDog 값이 변경되었습니다. 그런 다음 Integer를 사용하여 동일한 작업을 수행하려고했습니다. 그 가치가 변하지 않았기 때문에 놀랐습니다. 누군가 내가 왜 설명 할 수 있을까요? Integer와 Java의 메소드에 대한 참조 전달

5

가 사전에 감사

로버

최대 :

package testtest; 

class Dog { 

    String name; 

    public Dog(String name) { 
     this.name=name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

public class Main { 

    public static void main(String[] args) { 

     Dog myDog = new Dog("Rover"); 
     System.out.println(myDog.getName()); 
     foo(myDog); 
     System.out.println(myDog.getName()); 

     Integer i = 5; 
     changeValue(i); 
     System.out.println(i); 
    } 

    public static void changeValue(Integer i) { 
     i = 50; 
    } 
    public static void foo(Dog someDog) { 
     someDog.setName("Max");  // AAA 
     someDog = new Dog("Fifi"); // BBB 
     someDog.setName("Rowlf"); // CCC 
    } 

} 

그리고 출력했다 :

내 테스트 코드입니다.

+1

"자바 항상 통과별로 가치." - 가장 많이 투표 한 답변에서. 그러나, 그것은 *** 약간 다른 *** 개체 (원시 데이터 형식 이상)와 작동합니다. 그것이 바로 객체가 참조에 의한 통과와 거의 같은 이유입니다. 해결책은 이것을 설명 할 것입니다 –

+0

누군가가 이것을 더 잘 설명 할 수있을 것입니다 만, Java에서는'Integer' 객체를 원시 int 값으로 할당 할 때 자동적으로 새로운'Integer' 객체를 만듭니다. '. 그래서이 경우'i'는'changeValue()'안에 새로운 객체 참조를 주었고'main()'의'i'는 그대로 둡니다. – jonhopkins

+0

링크 된 질문과 답변의 어떤 부분을 이해하지 못합니까? –

답변

4

정수는 변경 가능한 클래스가 아닙니다. (그것에는 set 메서드가 없습니다.) 이전 변수를 다른 Integer로 가리킬 수는 있지만 메서드에 전달한 Integer는 변경되지 않습니다.

0

정수는 원시 데이터 형식입니다. 메서드 내에서 변경할 수 없습니다.

개체를 메서드에 전달하면 해당 개체에 액세스 할 수있는 멤버 변수를 변경할 수 있습니다.

Java에는 정수, char 등의 기본 유형에 대한 특수 래퍼 클래스가 있으며 객체와 비슷하지만 메소드 내부에서 값을 변경할 수도 없습니다. 그게 내가 아는 유일한 예외예요.

0

이미 지적했듯이 기본 유형은 값으로 전달됩니다. 그러나 참조로 원시를 전달할 필요가 있다면 배열을 사용할 수 있습니다.

public class PassByRefMain { 

    public static void main(String[] args) { 
     PassByRefMain m = new PassByRefMain(); 
     int[] number = new int[]{5}; 
     System.out.println(number[0]); 
     m.changevalue(number); 
     System.out.println(number[0]); 
    } 

    public void changevalue(int [] number){ 
     number[0] = 9; 
    } 
} 

출력 될 것

5 
9