클론이 다른 물체에 개인 필드를 설정할 수있는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/976243

  •  13-09-2019
  •  | 
  •  

문제

나는 Java를 배우고 있으며, 내가 읽고있는 책에는 복제에 관한 다음 예제가 있습니다. ~ 안에 clone(), 첫 번째 인스턴스는 버퍼가 있지만 새 객체에서 버퍼를 설정할 수 있습니다. private. 필드가 필요한 것 같습니다. protected 이것이 작동하기 위해.

이것이 허용되는 이유는 무엇입니까? 하다 clone() 액세스 할 수있는 특별한 권한이 있습니다 private 필드?

public class IntegerStack implements Cloneable {
    private int[] buffer;
    private int top;

    // ... code omitted ...

    @Override
    public IntegerStack clone() {
        try{
            IntegerStack nObj = (IntegerStack) super.clone();
            nObj.buffer = buffer.clone();
            return nObj;
        } catch (CloneNotSupportedException e)
        {
            throw new InternalError(e.toString());
        }
    }
}
도움이 되었습니까?

해결책

그만큼 private 수정자는 동일한 인스턴스 만 필드에 액세스 할 수 있음을 의미하지는 않습니다. 동일한 클래스의 객체 만 액세스 할 수 있음을 의미합니다.

그만큼 자바 언어 사양 말한다 §6.6, 액세스 제어:

... 멤버 또는 생성자가 개인으로 선언 된 경우 최상위 클래스의 본문 내에서 발생하는 경우에만 액세스가 허용됩니다. (§7.6) 이는 멤버 또는 생성자의 선언을 동봉합니다.

다시 말해, 클래스 내부의 모든 것이 언제든지 액세스 할 수 있습니다. 중첩 된 클래스조차도 액세스 할 수 있습니다 private Enclosing 클래스의 멤버 및 생성자 및 그 반대도 마찬가지입니다.

(당신은 그것을 오해하는 데 혼자가 아닙니다. "당신의 가장 긴 프로그래밍 가정은 무엇입니까?)

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