2014-09-10 2 views
0

나는이 질문이 Is Java "pass-by-reference" or "pass-by-value"?과 관련이 있다고 생각하지만 실제로는 그렇지 않다. 가정하자루프에서 Java "pass-by-value"

나는이 루프 코드를 가지고 :

ArrayList<foo> list = new ArrayList<foo>(); 
Calendar cal = Calendar.getInstance(); 
for(int i = 0; i < 10; ++i) { 
    cal.set(Calendar.HOUR, i); 
    list.add(new foo(cal)); 
} 
for(int i = 0; i < 10; ++i) { 
    System.out.print(list.get(i).calToString()); 
} 

foo.class 위 :

public class foo { 
    private Calendar mCal; 
    public foo(Calendar cal) { 
     mCal = cal; 
    } 
    public String calToString() { 
     return String.valueOf(mCal.get(Calendar.HOUR)); 
    } 
} 

결과 목록은 모든 항목을 9-Calendar.HOUR 세트가 있습니다. 9999999999을 인쇄합니다. 어떻게하면 각 항목이 0-9가되도록 만들 수 있습니까? 루프 내의 변수 cal을 인스턴스화하는 것이 성능 문제가됩니까 (foo이 더 복잡한 클래스 인 경우)?

+1

가능한 중복 http://stackoverflow.com/questions/18249555/is-java-pass-by-value 또는 -pub-by-reference-or-both) –

답변

3

실제로 개체를 덮어 쓰고 루프 외부에서 선언 했으므로 값을 계속 변경합니다.

루프 내에 인스턴스를 새로 만들어야합니다. 아니요, 성능 문제는 알 수 없습니다.

+0

그래, 루프 내에서 Calendar 변수를 인스턴스화했지만 여전히 선언을 외부에 유지 한 다음 0- 9. 그러나 루프 밖의 변수 선언이 메모리 할당과 관련하여 루프 내에서 선언과 다른 점은 무엇입니까? –

+0

메모리 할당 측면에서, 첫 번째 경우에는 한 객체에 대한 메모리 만 할당하고 각 반복에서이를 덮어 썼습니다.두 번째 경우 (내 대답)에서는 매번 새 개체를 만듭니다. – Maroun

+0

나는 그 선언을 의미했다. 나는 당신이 말한 것을하고 루프 안에서 인스턴스화했지만, 나는 그 선언을 외부에 두었다. 루프 내에서 선언을 이동 한 경우의 차이점은 무엇입니까? –

2

루프의 반복마다 새로운 Calendar을 초기화해야합니다. 같은

뭔가 :

for(int i = 0; i < 10; ++i) { 
    Calendar cal = Calendar.getInstance(); 

그렇지 않으면, 같은 인스턴스를 참조 할 때마다.

따라서 set 호출은 Calendar을 수정하므로 모두 9이됩니다.

더 우아하게 아마도 Foo 클래스를 생성하고 실제 시간은 int 인 생성자로 초기화 할 수 있습니다.

그러면 FooCalendar 인스턴스로 변경합니다.

0

클래스 홈페이지

{ 공공 정적 무효 메인 (문자열 []에 args) {

ArrayList<foo> list = new ArrayList<foo>(); 
    Calendar cal = null; 
    for (int i = 0; i < 10; ++i) { 
     cal=Calendar.getInstance(); 
     cal.set(Calendar.HOUR, i); 
     list.add(new foo(cal)); 
    } 
    for (int i = 0; i < 10; ++i) { 
     System.out.print(list.get(i).calToString()); 
    } 
} 

}

클래스 foo는 { 개인 일정 MCAL;

public foo(Calendar cal) { 
    mCal = cal; 
} 

public String calToString() { 
    return String.valueOf(mCal.get(Calendar.HOUR)); 
} 

}

당신이 당신의 달력 개체를 덮어 쓰는

[값에 의해 자바 패스인가 또는 참조 또는 모두 통과?] (의
관련 문제