2010-07-15 3 views
2
.... 그래서

플로트 [] 행동

, 난 요청할 수 있습니다, 왜이이에 대한 간단한 대답은 내가 몇 분에서 바보가 된 기분하지만 여기 그것이 늦게 피곤 메신저, 이동

임 확인 이 코드 ...

public class TestProcess { 

    final float[] finalFloats = {0.9f,0.8f,0.7f}; 
    float[] floats; 

    public static void main(String[] args) { 
     new TestProcess();  
    } 

    public TestProcess(){ 
     floats = finalFloats; 
     printTotal(); 
     floats[0]=0.1f; 
     printTotal(); 
     floats = finalFloats; 
     printTotal(); 
    } 

    void printTotal(){ 
     float count = 0f; 
     for(float f : floats){ 
      count+=f; 
     } 
     out("Count:"+count); 
    } 

    void out(String s){ 
     System.out.println(s); 
    } 

} 

내가 예상이 출력

Count:2.4 
Count:1.6 
Count:1.6 

줄 않습니다

Count:2.4 
Count:1.6 
Count:2.4 

나는 매우 어리 석다. ..!

이 질문은 또한 link text, 다른 포럼에서 답변을 얻으려면 여기에 게시됩니다.

+1

문제는 배열이 아닌, 문제는 당신이 참조가 작동하는 방법을 오해입니다. (또는 참조 자료가 여기에 표시된다는 사실을 깨닫지 못합니다.) – Joren

+1

+1 -이 질문은 간단한 질문이지만 올바른 방법을 묻습니다. 당신은 당신의 코드를 보여 주었고, 결과물을 보여 주었고, 당신이 기대하는 행동이 무엇인지를 말했습니다. –

+0

예, 나는 여기에 놀이에 참조를 얻지 못했고, 나는 프리미엄에 대해 생각하고있었습니다 ... doh! – Dori

답변

6

Java 배열은 변경 가능한 참조 유형입니다.

floats = finalFloats;을 쓸 때 floats 필드는 finalFloats과 동일한 배열 인스턴스를 참조하게됩니다.
따라서 floats[0]=0.1f을 쓰면 원본 finalFloats 배열도 수정됩니다.

모든 final 키워드는 finalFloats에 새 인스턴스 (예 : finalFloats = new float[7])를 지정하지 못하게합니다. 당신이 인스턴스를 돌연변이시키는 것을 막지는 못합니다. 당신이 예상대로 동작하도록하려면

, 당신은 다음과 같이 배열의 복사본을 만들 필요가 :

floats = Arrays.copyOf(finalFloats, finalFloats.length); 
+0

아, 감사합니다. 나는 무엇인가 수정 될 수 없다고 생각했기 때문에 나는 obviosuly 최종 선언을 오해했다. 고맙습니다!! – Dori

+0

나는 플로트 []가 원시적이라고 생각하는 실수를했다고 생각한다. 나는 피곤하다. 나의 유일한 변명이다 ....이 질문이 얼마나 쉬운지를 깨달았다. 오. – Dori