2014-05-09 2 views
2

우선 Java에서 passing by value이라는 것을 이해합니다.Java에서 값 전달 방법

또한 개체 나 배열을 전달할 때 메서드에 전달 된 배열의 주소임을 이해합니다. 따라서 메서드 내에서 배열 변수를 수정하면 외부 배열 변수에 영향을줍니다. change 내부 a 외부 실제로 배열이기 때문에 예를 들면

,

private void change(int[] a) { 
    a[0] = 1234; 
} 

public static void main(String[] args) { 
    int[] a = new int[2]{1,2}; 
    change(a); 
    System.out.println(a[0]); 
} 

출력은 1234 것이다. 출력이 12341하지 왜

private void change(int[] a) { 
    a = new int[3]{1234, 4, 5}; 
} 

public static void main(String[] args) { 
    int[] a = new int[2]{1,2}; 
    change(a); 
    System.out.println(a[0]); 
} 

: 이해가 안 무엇


다음 코드인가?

내부는 a 외부는 a과 동일합니다. 맞습니까? 또한 위의 예제처럼 내부가 a인데 왜 두 가지 출력이 다른가요?

+0

체크 아웃 http://www.javaworld.com/article/2077424/learn-java/does-java-pass-by-reference-or-pass-by-value.html – jefflunt

+0

'나는 지나가는 것을 이해합니다. Java에서 가치로. '당신은 참조가 무엇인지 이해해야합니다. –

답변

3

이것은 동일하지 않습니다. 두 번째 예에서는 로컬 참조 a을 변경하여 완전히 새로운 배열을 참조하고 기존 배열은 변경하지 않습니다. 그러나 이것은 메인에있는 a을 새 배열을 참조하는 것으로 변경하지 않습니다. 여전히 이전 배열을 참조하므로 1이 인쇄됩니다. 당신이 방법을 사용하여 maina에 완전히 새로운 배열을 다시 지정하고 싶었다면

change에서 새 배열을 반환하고 maina 해당 할당합니다.

+0

또는 새 배열의 모든 요소를 ​​배열'a'의 요소에 복사하십시오. –

0

참조가 값으로 전달 되었기 때문에 정확하게 나타납니다. 12345과 같은 5 자리 숫자의 객체 포인터를 나타냅니다. 다음 과정은 다음과 같습니다

  1. 우리는 메모리 위치에서, int[]{1,2}를 작성, 10000을 말한다. a10000 값을 지정합니다. amain에 해당하는 스택 프레임에 있습니다.
  2. 10000을 change으로 전달합니다.
  3. change가 실행 :
    1. change 위치 20000에서 새로운 배열을 작성하고이 하지main 스택 프레임에 영향을 미치지 않는다 20000 는 스택 프레임a의 값을 설정한다.
    2. change는 (void)를 반환합니다.
  4. 우리는 제로 번째 요소, 1를 인쇄하기 위해 원래의 배열에 의 손길이 닿지 않은 포인터를 복종.

change이 반환 할 때까지 {1234, 4, 5}에 대한 라이브 참조가 없습니다.

1

은의 당신의 기능을 검사하자

당신이 당신의 질문에 명시된 바와 같이
private void change(int[] a) { 
    a = new int[3]{1234, 4, 5}; 
} 

a 배열에 대한 참조 이다. 그것을 사용하여 배열을 수정하면 (예 : a[0]=1234) 함수에 전달 된 동일한 배열이 변경됩니다.

참조 자체를으로 변경하면 더 이상 원래 배열을 가리 키지 않으며 원본 배열에는 변경 사항이 적용되지 않습니다.

0

Java에서 모든 변수는 객체에 대한 참조입니다.

변수를 배열에 전달하면 해당 참조가 객체에 전달됩니다. 객체를 수정하면 호출 객체 (동일한 객체를 참조하는 변수도 있음)에서 변경 내용이 표시됩니다.

"a = new int ..."라고 쓰면 변수 a의 값이 다른 개체를 가리 키도록 변경됩니다. 더 이상 호출하지 않은 메서드와 동일한 개체를 참조하지 않습니다. 따라서 호출하는 메소드와 호출 된 메소드는 다른 것을 봅니다.

0

매개 변수를 값으로 전달하면 기본적으로 메서드의 관점에서 복사된다는 것을 의미합니다. 따라서 배열에 참조 a이 있고 어떤 메서드에 전달하면 해당 메서드 내에서 동일한 참조에 a이라는 또 다른 참조가 있습니다. 이제 해당 참조 (a = new int[]...)에 새 값을 할당하면 로컬 a 변수 만 새 배열을 가리 키도록 수정됩니다.

0

대답은 변경하려고 할 때 어떤 변수가 범위 내에 있는지와 마찬가지로 참조 또는 값을 전달하는 것과 관련이 있습니다.

"a"나 다른 변수를 메서드에 전달하면 해당 변수의 값, 즉 실제 변수 자체가 아닌 해당 변수의 복사본을 전달합니다. 예 :

public static void main(String[] args){ 
    int a = 3; 
    addTwo(a); 
    System.out.println(a); 
} 

private void addTwo(int a){ 
    a += 2; 
} 

위의 예제에서 값 3은 addTwo에 전달됩니다. 주 메소드의 변수 "a"는 범위 밖에 있습니다 (즉, main 메소드에 현지화되어 있음). 따라서 addTwo 메소드는 "a"의 사본에만 적용되고 변수는 사용되지 않습니다. 변수 "a"는 변경되지 않습니다. 메서드가 완료되면 a의 값은 무시되고 main 메서드의 원래 "a"는 변경되지 않습니다.

귀하의 경우에도 마찬가지입니다. 두 변수에 동일한 이름을 사용하는 것은 중요하지 않습니다. 기본 메소드의 변수는 변경되지 않습니다.