2014-11-16 3 views
0

누구든지이 코드의 출력이 다음과 같이 왜 나에게 설명 할 수 있습니까? 이 자바 코드의 출력을 찾을 수 없습니다

0 40 
0 40 

public class Class extends Main { 

    public static void main(String[] args) { 
     int x = 0; 
     int [] arr = {20}; 
     f (x, arr); 
     System.out.println(x + " " + arr[0]); 
     g (x, arr); 
     System.out.println(x + " " + arr[0]); 
    } 

    public static void f(int x, int[] arr) { 
     x += 30; 
     arr[0] = 40; 
    } 

    public static void g(int x, int[] arr) { 
     x = 50; 
     arr = new int[] {60}; 
    } 

} 

는 I는 다음과 같이되어야한다고 생각했다

0 20 
0 20 

답변

1

배열이 목적 때문에이 방법으로 전달 될 때, 그 오브젝트에 대한 참조를 전달한다. 따라서 메서드 호출은 배열의 요소를 변경할 수 있으며 변경된 배열은 메서드에 전달 된 배열과 동일합니다. 따라서 f()의 발신자는 이러한 변경 사항을 확인합니다.

반면에 메서드에 원시 값을 전달하면 변수 복사본이 만들어지고 메서드에 의해 수행 된 변경 사항은 메서드의 범위에 국한됩니다. 메서드가 객체 참조를 포함하는 변수를 받고 새로운 참조를 할당하려고 할 때도 마찬가지입니다. 해당 할당은 메소드에 국한됩니다. 그래서 g()은 전달 된 배열을 변경하지 않습니다.

+0

은 또한 당신이 사용 여부는 중요하지 않습니다 언급 실제 배열에 영향을 것입니다 참조에 의해 전달된다 어떤 사람들은 실제로'정적 인 '것이 무엇을 의미하는지 모른다. – Charlie

0

따라서 f() 메소드를 호출하는 동안 은 배열 객체 참조를 f 메서드에 대한 값으로 전달하므로 [0]에 액세스 할 수 있으며이 값은 어떤 일을하는지, 따라서 30을 얻습니다.

이제 g() 메서드를 호출하면 배열 객체의 참조를 값으로 다시 전달하고 내부적으로 배열에 새 인스턴스를 할당하려고 시도합니다. 이는 완전히 유효합니다. 그 방법 내에서 기대했던 변화를 보게 될 것입니다. 그러나 여러분이 main으로 되돌아 왔을 때, 여러분은 이전의 동일한 참조를 보았습니다 (우리는 원래의 객체 참조가 아닌 값으로 참조를 전달했음을 기억합니다). 따라서 오래된 40을 값으로 봅니다 .

0

자바에서 배열은 객체이고 객체는 당신이 방법의 배열에 변화를 할 때 그래서 그것은 또한

관련 문제