2012-07-20 2 views
5

나는 Java에서 모든 것이 가치에 의해 전달된다는 것을 알고있다. 그러나 객체의 경우 전달되는 객체에 대한 참조 값입니다. 이것은 때로는 객체가 매개 변수를 통해 변경 될 수 있다는 것을 의미합니다. 즉, 사람들이 말하는대로, 매개 변수를 수정하지 마십시오."참고치"로 전달 하시겠습니까? 약간의 설명이 필요함

하지만 다음 코드에서는 다른 결과가 발생합니다. 당신이 main()에 돌아 오면 changeIt()에서 s은 변경되지 않습니다 : 내가 추측하고있어

public class TestClass { 

    static String str = "Hello World"; 

    public static void changeIt(String s) { 
     s = "Good bye world"; 
    } 

    public static void main(String[] args) { 
     changeIt(str); 
     System.out.println(str); 
    } 
} 

- 내가 확인하고 싶습니다 - 당신이 s = "something"을 말할 때 동일하거나 String s = new String("something") 말과 동등하다고. 이것이 s이 변경되지 않는 이유입니까? changeIt()을 종료하면 버려지는 완전히 새로운 객체가 로컬에 할당됩니까?

+1

나는 이런 종류의 질문/대답을 전에 보았고 나는 여전히 리뷰가 필요하다고 느낀다. +1 – BlackVegetable

+0

Java의 문자열이 변경 불가능한 객체이기 때문에 변경되지 않습니다. – anio

+1

@anio 아니,이 특정 코드가 문자열을 변경하지 않는 이유는 아닙니다. 어떤 객체에서도 똑같은 동작을 할 것입니다. (할당을하고 나서,받은 객체에 어떤 메소드도 호출하지 않기 때문에) – nos

답변

4

당신의의 =를 말할 때 "뭔가"가 동일하거나 문자열의 = 새 문자열 ("뭔가")를 말하는 동등하다는

예, 거의. (JVM이 여러 번 사용 된 동일한 문자열 리터럴이 동일한 String 객체를 참조하도록 최적화를 수행 할 수도 있음).

s가 변경되지 않는 이유는 무엇입니까? 로컬로 완전히 새로운 객체가 할당되어 changeIt()을 종료하면 버려집니다.

예. 여러분이 말했듯이, 모든 것은 자바에서 값으로 전달되며 심지어 객체에 대한 참조도 전달됩니다. 따라서 changeIt(String s)의 변수 s은 main()에서 사용하는 str과 다른 값입니다. 이는 changeIt 메소드 내의 로컬 변수 일뿐입니다. 다른 개체를 참조하도록 해당 참조를 설정하더라도 changeIt의 호출자는 영향을받지 않습니다. String 객체 sstr는 의미로 당신이 s

에 다른 객체를 할당 당신이 알아야 할 또 다른 일이있다 전에 changeIt() 방법을 입력 할 때 여전히 같은 문자열입니다 참조하고, 그 것을

주 그 문자열은 불변이다. 즉, 문자열 객체에 대해 호출하는 메서드는 해당 문자열을 변경하지 않습니다. 예 : changeIt() 메서드 내에서 s.toLowerCase()을 호출해도 호출자에게 영향을주지 않습니다. 이는 String.toLowerCase()가 객체를 변경하지 않고 새로운 String 객체를 반환하기 때문입니다.

0

예, 이제 'S'는 범위가 해당 메서드로 제한되는 새로운 개체를 가리 킵니다. 문자열은 값 별 개념을 이해하는 데 완벽한 예제가 아닐 수 있습니다. 문자열 대신에 변경 가능한 객체 참조를 전달하고 메서드 내에서 새 객체를 할당하도록 변경해 보겠습니다. 당신은 그것들을 대상 밖에서 보지 못합니다.

public class MyMain { 

    private static void testMyMethod(MyMain mtest) { 
     mtest=new MyMain(); 
     mtest.x=50; 
     System.out.println("Intest method"+mtest.x); 
    } 
    int x=10; 
    public static void main(String... args) 
    { 
     MyMain mtest = new MyMain(); 
     testMyMethod(mtest); 
     System.out.println("In main method: "+mtest.x); 
    } 
} 

SO discussion에서 두 번째 대답을 읽으십시오.

+0

이것은 잘못된 것입니다. 변경 가능한 객체에 대한 변경 사항을 볼 수 있습니다 : static Point myPoint = new Point (0,0); public static void changeIt (Point p) { p.setLocation (1,0); } \t public static void main (String [] args) { changeIt (myPoint); System.out.println (myPoint); \t}'java.awt.Point [x = 1, y = 0] '을 인쇄합니다. – NominSim

+0

@NominSim : 예제를 확인하고 매개 변수를 final로 설정하면 새 객체를 할당 할 수 없습니다 그 참조. – kosa

+0

@ NominSim : 가능한 경우이 링크에서 두 번째 대답을 찾으십시오. http://stackoverflow.com/questions/40480/is-java-pass-by-reference – kosa

3

당신은 새 문자열에 대한 참조로 s의 값을 변경하는

s = "Good bye world"; 

쓸 때. s이 참조하는 문자열의 값을 변경하지 않습니다.

관련 문제