2014-10-04 3 views
-2
Dog.setName("Kutta"); // this is how you call a setter method 
String Naam = Dog.getName(); 
System.println(Naam); //Kutta 
Naam = "Kutte ki Ma"; 
System.println(Dog.getName()); // Is this *Kutte ki Ma* or is it *Kutta*? 

왜? Java가 참조로 값을 전달하면 Naam이 Dog.getName()을 가리 키지 않아야합니까? 이 경우 Naam이 수정되면 Dog 객체의 Name 변수 (여기에서 사용되는 클래스에 비공개)를 직접 수정하면 안됩니까? 그게 결함이 아닌가?Java에서 값을 기준으로 참조 전달하기

+6

Dog.getName() = "Kutta";'컴파일됩니까? – Rustam

+0

실행 시간 동작에 대해 이야기하기 전에 컴파일하는 코드를 게시해야합니다 ... 문제를 나타내는 짧지만 완전한 프로그램을 게시하십시오. –

+0

@hrishirc이 스레드를 살펴보십시오. http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-byvalue 특히 두 번째 최상의 답변에주의하십시오. 자세히 알아야합니다. – Alboz

답변

1

문자열이 immutable이기 때문에 Naam = "Kutte ki Ma";을 입력하면 기존 문자열 개체가 변경되지 않으므로 새 문자열을 만들고 Naam 변수에 할당합니다.

이것이 의미하는 바는 할당이 실제로 이전의 문자열을 참조하는 개 이름 근처로 가지 않는다는 것입니다. 따라서 변경되지 않습니다.

+0

자신의 프로그램이 실행될 것이라고 생각합니까? – Rustam

+0

문자열이 아니라 가변적이라고 가정하면 – hrishirc

+0

@hrishirc'int'는 프리미티브 (그래서 참조가 없습니다)이고'Integer' (int 형의'Object' 래퍼)는 불변입니다. –

1

여기에 게시 된 코드는 개 이름을 설정하지 않으므로 위에 해당하지 않습니다. 당신이 전화를했다면

Dog.setName("Kutta"); 

자바는 값으로 패스입니다 (하지만 Object의 값은 기준입니다)입니다. , String은 Java에서 변경할 수 없으며 다른 인스턴스가 보유한 String에 대한 참조를 업데이트 할 수 없습니다.

당신은 당신이 뭔가를 할 수 StringBuilder, 당신이 기대하는 것으로 수행

public static void main(String args[]) { 
    Dog d = new Dog(); 
    d.getName().append("Kutta"); 
    StringBuilder Naam = d.getName(); 
    System.out.println(Naam); //Kutta 
    Naam.setLength(0); 
    Naam.append("Kutte ki Ma"); 
    System.out.println(d.getName()); 
} 

static class Dog { 
    private StringBuilder sb = new StringBuilder(); 
    StringBuilder getName() { 
     return sb; 
    } 
} 

를 사용한다면.

관련 문제