2014-04-22 2 views
-1

오늘 간단한 프로그램을 작성하는 동안 몇 가지 이상한 동작이 발견되었습니다. 다른 정렬 된 배열을 반환하는 간단한 정렬 방법을 작성했습니다.Java 매개 변수 값 자체가 변경됨

public double[] sortMe(double[] array) 
{ 
    double[] narray=new double[array.length]; 
    narray=array; 
    for(int i=0;i<narray.length;i++) 
    { 
     for(int j=0;j<narray.length;j++) 
     { 
      if(narray[i]<narray[j]) 
      { 
       double temp=narray[i]; 
       narray[i]=narray[j]; 
       narray[j]=temp; 
      } 
     } 
    } 
    // TODO Auto-generated method stub 
    return narray; 
} 

드라이버 클래스에서이 sortMe 메서드를 호출하면 내 testArray도 업데이트됩니다. testArray가 sortMe 메소드의 범위를 벗어 났으므로 testArray가 정렬되면? 당신의 sortMe 방법에서

double [ ] testArray = {3, 6, 2, 5, 8, 4, 1, 7}; 
double [ ] results; 
results = af.sortMe(testArray); 
af.printMe(results); 
+0

'Pass by Value'및 'Pass by Reference'에 대해 읽어보십시오. 그것은 당신의 질문에 대답 할 것입니다. http://stackoverflow.com/questions/373419/whats-the-difference-between-passing-by-reference-vs-passing-by-value –

+0

이것을 확인하십시오. http://stackoverflow.com/questions/40480/is-java-pass-by-reference – root

답변

0

, 당신은 narray=array;를 사용 narrayarray의 참조를 할당한다.

이 지금 narrayarray으로 같은 배열을 가리키는 의미하고, 당신이 narray을 수정하는 경우 그래서, 배열도 변경되어 배열 그냥 메서드에 전달 testArray에 대한 참조를 가지고 있기 때문에, testArray도 정렬됩니다.

당신이 testArray이 array를 할당 할 때, narray로 변경 narrayarray의 값을 복사 System.arraycopy()를 사용하지 않으려면

. 아래 그림과 같이 변경하십시오. 당신을 무엇

System.arraycopy(array,0,narray,0,array.length); 
+0

정말 고마워요. –

0

다음 행이 할 생각 :

double[] narray=new double[array.length]; 
narray=array; 

그것은 즉시 폐기하고, 매개 변수 배열과 같은 인스턴스를 할당 새 배열을 만듭니다.

새 배열을 반환하려면 생성자에서 사용하거나 배열 A의 배열을 배열 B에 수동으로 복사하십시오. 정렬 작업을 수행하고 있으므로이 작업을 수행 할 필요가 없을 수도 있습니다 .