2013-05-09 2 views
1

연습 문제를 검토하고 있는데 프로그램의 응답 순서에 대해 알고 싶습니다 ---> 2 1 주로 주 드라이버를 이해하는 데 어려움이 있습니다. 요구. 나는 그 방법의 사용법을 이해한다.도움이 필요함 프로그램 실행 이해

코드는 :

public class Test { 
    public static void main(String[] args) { 
    int[] x = {1, 2, 3, 4, 5}; 
    increase(x); 

    int[] y = {1, 2, 3, 4, 5}; 
    increase(y[0]); 
    System.out.println(x[0] + " " + y[0]); 
    } 
    public static void increase(int[] x) { 
    for (int i = 0; i < x.length; i++) 
     x[i]++; 
    } 
    public static void increase(int y) { 
    y++; 
    } 
} 
+0

변수 범위를 살펴보고 값으로 전달하십시오. –

+2

당신이 알고있는 것과 어떻게 그것이 효과가 있다고 생각하는지 우리에게 설명해주십시오. –

답변

1

자바 메소드는 객체 형의 경우, 프리미티브 또는 레퍼런스 복사의 경우에, 사용자가 전달한 값의 사본을 수신한다. increase(int[])은 참조 유형 인 배열을 받아 해당 배열의 각 값을 증가시킵니다. 이 메서드는 배열 참조의 복사본을 받고 변경하지 않습니다. 배열의 각 요소를 증가 시키며 전송 한 배열과 같습니다.

increase(int)으로 약간 다릅니다. y 변수는 전달한 값의 복사본입니다. y이 증가하면 해당 복사본이 증가합니다. 원래 값은 변경되지 않습니다. 그래서 당신이 전달하는 가치가 실제로 변하지 않는다는 것이 외관입니다.

따라서 출력은 2 1이됩니다.

0

증가 (x)에서는 배열의 참조를 전달하므로 증분이 실제로 실제 값을 증가시킵니다. 두 번째 인스턴스에서 배열의 특정 값을 전달하는 동안 배열에 보유 된 값에 실제로 영향을 미치지 않습니다. 자세한 내용은 Check out the answer here

4

코드는 (첫 번째 증가 방법에서) call-by-reference와 두 번째 증가 방법에서 값별로 call 간의 차이점을 보여줍니다. 사실 두 메소드 모두 값으로 호출을 사용하지만, 첫 번째 경우 값은 객체 (배열)에 대한 참조이고 두 번째 경우에는 int (배열의 단일 값)입니다.

코드 int[] x = {1, 2, 3, 4, 5}은 배열을 생성합니다. 증가 (x)를 호출하면 첫 번째 증가 방법이 호출됩니다. 이 메서드는 배열 요소를 반복하고 각 요소를 증가시킵니다. x[i]++ 줄은 x[i] = x[i] + 1과 같습니다. 결과는 배열에 다시 저장됩니다. 이 호출이 끝날 때까지 배열에는 이제 {2, 3, 4, 5, 6}이 포함됩니다. 따라서 x[0]2입니다. 우리는 어레이로 전달하지 increase(int y) 내지 제 호출

하지만 y[0] 값의 (즉 1). 이 메서드는 변수 y을 증가 시키지만 메서드 외부에서는 효과가 없습니다. Java에서는 변수를 전달할 때 값에 의해 전달되고 기본적으로 값의 사본이 전달된다는 의미입니다. 해당 값에 대한 변경 사항은 원본에 영향을 미치지 않습니다.

배열을 전달할 때 배열 개체에 대한 참조를 전달합니다. 참조는 변경할 수 없지만 객체의 내용 (배열의 내용)은 변경할 수 있습니다.

나는 그것이 약간 혼란 스럽다는 것을 인정해야한다. 그러나 나는 몇 번이나 쓴 것을 다시 읽고 잘하면 당신은 그것을 얻을 것이다!

+0

정말 고마워요 !! 나는 증가 (x)의 첫 번째 호출을 이해할 수 있었지만, 두 번째 증가 (int y) 호출은 실제로 나를 혼란스럽게 만들었다. 나는 그것을 지금 이해하고 그것을 완전히 이해하기 위해 계속해서 다시 읽어야 할 것입니다. 다시 한 번 감사드립니다! – user2045470

관련 문제