문제
이와 같은 회원 변수가있는 경우 (수업 본문에서 선언)
private Dot[] dots=new Dot[numDots];
나는이 배열의 모든 멤버를 반복하고 :
1) 모든 점 객체를 다른 클래스의 함수로 전달합니다.
2) 일부 조건이 충족되면 세 번째 클래스의 또 다른 기능으로 전달합니다.
3) 그리고 세 번째 클래스는 도트 객체의 속성을 변경합니다.
그렇다면이 개체가 원래/부모 클래스로 반환되면 그 속성에 대한 변경 사항이 유지 되었습니까? 아니면 2 차/3 차 기능에 의해 로컬 변수처럼 취급됩니까?
해결책
예, 속성 변경이 유지됩니다. Java는 100% 패스 별 가치이지만 객체를 통과 할 때 전달 된 "값"은 실제로 객체에 대한 포인터입니다. 따라서 메소드에서 객체를 변경하면 실제 객체를 전달한 객체를 변경합니다.
즉, 다음 방법이 있으면 호출 방법에 변경 사항이 표시됩니다.
private void updateMyDot(final Dot aDot) {
aDot.dotColor = new Color(255,255,255);
}
그러나 다음을 수행하면 호출 방법이 ~ 아니다 변경 사항을 참조하십시오.
private void updateMyDot(/* not final */ Dot aDot) {
aDot = new Dot();
aDot.dotColor = new Color(255,255,255);
}
두 번째 예에서는 발신자가 의지합니다 ~ 아니다 변경 사항을보고 새로 생성 된 것을 볼 수 없습니다. Dot
물체.
다른 팁
물체는 통과합니다 [참조 값은 값이 참조 인 경우] (객체에서 상속되는 것), 원시 값 (int, long, double 등)은 값으로 전달됩니다.
이것은 원시를 발신자로부터 메소드로 전달할 때 복사 된 반면, 객체 A와 함께 [의 가치] 참조가 전달됩니다.
이는 객체가 방법으로 돌연변이되면 발신자가 동일한 객체에 대한 참조가 있기 때문에 이러한 변경 사항을 본다는 것을 의미합니다.
반대로 메소드가 원시를 변형시킬 때 메소드가 사본에서 작동함에 따라 발신자는 변경 사항을 보지 못합니다.
편집의 이유
Java가 참조로 통과했다면 다음을 수행 할 수 있습니다.
Object x;
x = new Integer(42);
foo(x);
System.out.println(x.getClass()); // pass by reference would have it print out java.lang.Float
FOO가 다음과 같이 정의됩니다.
void foo(Object o)
{
o = new Float(43);
}
Java는 값별로 참조를 전달하기 때문에 o = new Float(43);
허용됩니다. 그러나 발신자의 값은 new Integer(42);