문제

이와 같은 회원 변수가있는 경우 (수업 본문에서 선언)

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);

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top