2014-06-08 3 views
0

자바가 값으로 매개 변수를 전달한다는 사실을 잘 알고 있으며 개체가 참조로 유익하게 보관되므로 값을 변경할 수있을 때 개체 값을 변경할 수있는 방법을 잘 알고 있습니다. 또한 클래스 String은 불변 인 객체를 포함한다는 것을 이해합니다. 그래서, 내 이해를 테스트하기 위해 매개 변수로 메서드에 개체를 전달하고 문자열과 int 변수를 모두 변경 한 다음 인쇄하는 코드를 작성하기로 결정했습니다. 나는 매개 변수가 단순히 복사본 일 뿐이므로 이러한 변경은 전달 된 변수에 영향을 미치지 않을 것이라고 예상했다. 객체를 매개 변수로 전달하면 전체 객체를 새로운 변수에 복사하지 않고 단순히 객체 참조를 전달합니까? 이것은 내가 여러 소식통들로부터 들었던 것과는 상반됩니다.카운터 직관적 인 개체 매개 변수 동작

public class Test { 


    public int testVar = 20; 
    public String testString = "Hello"; 

    public static void testCheck(Test test){ 
     test.testString = new String("GoodBye"); 
     test.testVar = 10; 
    } 

    public void printTest(){ 
     System.out.println("testVar: " + testVar + " testString: " + testString); 
    } 

    public static void main(String[] args) { 
     Test test1 = new Test(); 
     test1.printTest(); 
     testCheck(test1); 
     test1.printTest(); 

    } 

} 

출력 : 예상

testVar: 20 testString: Hello 

testVar: 10 testString: GoodBye 

: 사전에

testVar: 20 testString: Hello 

testVar: 20 testString: Hello 

감사합니다 여기에 문제의 코드입니다.

답변

1

Java에서 매개 변수는 항상 값으로 전달되므로 test은 실제로 test1의 복사본입니다. 당신이 실수하고있는 실수는 객체 변수를 복사해도 객체 인을 복사하지 않는다는 것입니다. 참조을 동일한 오브젝트에 복사합니다. 동일한 객체 인스턴스의 필드를 변경하려고하므로 두 참조 모두 새 상태로 표시됩니다. 반대로, String과 같이 변경 불가능한 객체 변수를 "업데이트"하면 새 객체 인스턴스를 참조하는 것입니다.

그런데 문자열 리터럴을 할당하는 대신 new String을 만드는 데는 거의 이유가 없습니다. 이 경우에는 전혀 없습니다.

0

참조 사본을 원본 개체에 전달하고 있습니다. 실제로, 당신은 원래 객체의 참조를 전달하는 등의됩니다

testCheck(test1); 

당신이 test1 객체의 속성/변수를 수정합니다.

1

몇 가지 개념 :

  • 목적은 데이터 및 동작을 가지는 컨스이다.
  • 변수는 값을 저장하는 구문입니다.
  • 개체 참조는 개체를 참조하는 값입니다.
  • 참조 유형 (기본 유형이 아닌 모든 유형)의 변수는 객체 참조를 해당 값으로 저장합니다.
  • 필드에서 액세스하거나 변수에서 메소드를 호출하면 JVM이 객체 참조 값을 참조 해제하고 객체를 가져 오며 액세스 또는 호출을 수행합니다.

이 마지막 요점은 testCheck 방법입니다. 또한,

  • 메소드 매개 변수는 메소드 정의에 선언 된 변수입니다.
  • 메소드 인수는 메소드를 호출 할 때 메소드 매개 변수에 바인드하려는 값입니다.
  • Java는 (by-value) 전달하고 object 참조의 값을 method 매개 변수에 바인드합니다.

단순히 그 객체 참조를 전달하는 A 새로운 변수로 전체 오브젝트 복사하지 파라미터로 객체를 전달 하는가?

그 문장은별로 의미가 없습니다. 인수로 전달하는 것은 값입니다. 이 값은 객체가 아니라 객체 참조입니다. 당신의 방법에서는 객체 참조를 참조하여 참조 필드에 접근하고 참조 된 객체의 메소드를 호출합니다.

관련 문제