2011-04-22 5 views
0

인수가 메소드 (Java)로 전달되는 순서가 정의되어 있습니까? 예를 들어, 코드 세그먼트인수가 메소드에 전달되는 순서 (Java)

Arrays.equals(ascendingSegment, Arrays.sort(ascendingSegment))

에 어느 나는 원래의 배열이 그것을 호출되는 정렬 방법 전에 전달되는 것을 보장하고, 배열이 실제로 정렬 오름차순 있는지 확인하는 데 사용됩니다?

편집 : 약간의 오해가있는 것 같습니다. equals 메서드는 정렬되기 전에 ascendingSegment 복사본을 가져 오거나 첫 번째 인수가 전달되기 전에 먼저 호출되는 정렬입니까? {1, 5, 2, 4}과 같은 배열이 주어지면 equals 메서드는 의 인수 또는 인수로 {1, 5, 2, 4}{1, 2, 4, 5}을 수신합니까?

답변

1

Java는 다음과 같습니다. 전달 값.

값으로 전달하면 메서드를 호출 할 때 각 실제 매개 변수 값의 복사본이 메서드에 전달됩니다. 메소드 내에서 사본을 변경할 수는 있지만 실제 매개 변수에는 영향을주지 않습니다.

예에서 배열은 먼저 정렬 된 다음 Array.equals 메서드로 전달됩니다.

패스로 생각하고 있기 때문에 혼란이있을 수 있습니다. 참조 번호. Java가 인 이유를 설명하는 질문은 다음과 같습니다. : Is Java "pass-by-reference" or "pass-by-value"?

+0

예. 그러나이 경우 배열은 실제로 포인터이며 실제 값은 아닙니다. 따라서 포인터의 값은 복사되지만 여전히 동일한 배열을 가리키고 있습니다 – FeifanZ

+0

실제로 Java는 모든 인수에 대해 값이 나타날 것으로 기대합니다. 이러한 이유 때문에 예제의 모든 인수가 전달되기 전에 평가됩니다. 고마워요. – KushalP

+0

. 그것은 어딘가에 갈 것입니다. 그러나 정렬 전에 첫 번째 인수가 복사됩니까? 다시 말해서 인수 값을 실제 전달과 별도로 복사하는 것입니까? – FeifanZ

5

디버거를 사용하여 단계별로 실행하면 모든 인수가 평가되고 함수가 호출되는 것을 볼 수 있습니다.

나는 또한 게시 한 것을하려는 것이 나쁜 습관이라고 말하고 싶습니다. 객체를 테스트 할 때, 객체를 변형시킬 객체에 대해 어떤 연산도 수행해서는 안됩니다. 이 메서드 호출 후에는 테스트 전에 목록의 순서를 표시 할 수 없습니다.

편집 : Arrays.sort() 값을 반환하지 않습니다. 그러므로 당신은 이런 식으로 사용할 수 없습니다. Arrays.copyOf()을 사용하여 배열 복사본을 만들고 복사본을 정렬 한 다음 두 배열을 비교해야합니다.

+0

저는 자바 초보자입니다 ... 디버거를 찾을 수있는 곳이나 사용법을 모릅니다. : – FeifanZ

+1

@ Inspire48 : Eclipse와 같은 IDE를 사용하고 있습니까? 내장되어 있습니다. – unholysampler

+0

Eclipse에서 놀았지만 심각한 Java 프로그래밍을 수행하지 않으므로 주로 매크로와 함께 NotePad ++를 사용하고 있습니다. 'javac'와'java'를 호출합니다. – FeifanZ

1

Arrays.sort(...)은 아무 것도 반환하지 않기 때문에 예제가 컴파일되지 않습니다.

두 번째로, (가정적으로) Arrays.sort(...)이 결과를 반환하면 반환 된 결과에 따라 달라집니다.

  • 만약 (가상) Arrays.sort(...) 정렬 된 다음, 원래 배열의 복사 반환

    Arrays.equals(ascendingSegment, Arrays.sort(ascendingSegment)); 
    
    두 개의 서로 다른 배열 인수로 호출 될 것이다

    ; 즉 원래의 배열과 정렬 된 사본.

  • 여기에 해당 될 것이다 다음,

    Arrays.equals(ascendingSegment, Arrays.sort(ascendingSegment)); 
    

    을에서 적절한 종류를 수행 한 후 (가상) Arrays.sort(...)가 원래의 배열을 반환하는 경우 :

    Arrays.sort(ascendingSegment); 
        Arrays.equals(ascendingSegment, ascendingSegment); 
    

참고 :

  1. Java ca ll 매개 변수는 값에 의해 전달되지만 참조 유형 (예 : 객체 또는 배열)은 참조입니다. 즉, 배열 인수가 전달되면 실제로 배열 참조를 전달하고 호출 된 메서드는 복사본이 아니라 원래 배열을 가져옵니다.
  2. 프로 시저 호출에 대한 인수식이 왼쪽에서 오른쪽으로 계산됩니다.
+0

감사합니다. 거기에 컴파일 문제를 포착하지 않았습니다. 이것은 가상의 예입니다. 그리고 그것은 매우 잘 쓰여진 설명입니다. – FeifanZ

관련 문제