2016-07-12 4 views
-1

이것은 의미론의 경우 일 수 있지만 실용적인 문제로서 Java는 절대적으로 pass-by-value 방식으로 절대적으로 작동한다는 것을 발견했습니다. . 예를 들면 다음에Java Pass-by-Reference 혼란/예제

public String example() { 
    SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); 

    String sResult = "Example:"; 
    GregorianCalendar CAL = new GregorianCalendar(2016, 0, 1); //January 1, 2016 
    sResult += "\nBegin: CAL = " + f.format(CAL.getTime()); 
    passTo(CAL); 
    sResult += "\nEnd: CAL = " + f.format(CAL.getTime()); 
    return sResult; 
} 

public void passTo(GregorianCalendar CAL) { 
    CAL.add(CAL.DAY_OF_YEAR, 56); 
} 

실행 예()을 초래할 것이다

Example: 
Begin: CAL = 2016-01-01 
End: CAL = 2016-02-26 

분명히 passTo 방법 인수로 CAL 객체를 취한 예에 포함 된 원래의 오브젝트를 조작하고, 영향(). 원래 객체가 변경된 경우 값만 전달되었다고 주장 할 수있는 사람은 누구입니까?

이것은 프로그래밍에서 일반적으로 이해되는 참조 기준 전달의 정의에 맞을 것입니다.

+0

자바 **는 ** *** *** 값으로 전달됩니다. 그러나 참조 유형 (즉,'Object') **의 값은 ** a * reference *입니다. 다른 말로하자면, 'CAL'은 '그레고리오 캘린더'가 아니며 'CAL'은 '그레고리오 캘린더'에 대한 참조입니다. –

+0

_ 이것은 프로그래밍에서 일반적으로 이해되는 참조 기준 전달에 적합합니다. _ 참조 기준 _은 객체가 아닌 변수에 적용되는 개념입니다. 개념과 이름은 Java의 참조 값과 아무 관련이 없습니다. –

+0

이것은 사용자의 완전한 논리적 실패입니다. 인수가 메소드에 전달되면 메소드의 조치가 원래 오브젝트를 변경합니다. 이것은 참조로 전달하는 바로 그 정의입니다. 이것은 매우 불쌍한 의미의 경우입니다. 많은 프로그래머가 문제를 겪게 될 것이라고 생각합니다. – Palladium

답변

-1

다른 답변을 확인 했습니까?

어쨌든. 값을 기준으로 객체에 대한 참조를 전달하고 있습니다. C가 포인터를 전달하는 것과 비슷합니다. 참조가 복사되지만 메모리 위치를 참조하기 때문에 해당 메모리 위치의 내용을 수정할 수 있습니다.

개체가 아닌 원시 데이터 형식 (int, boolean 등)과 비교하십시오.