클론이 다른 물체에 개인 필드를 설정할 수있는 이유는 무엇입니까?
-
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 클래스의 멤버 및 생성자 및 그 반대도 마찬가지입니다.
(당신은 그것을 오해하는 데 혼자가 아닙니다. "당신의 가장 긴 프로그래밍 가정은 무엇입니까?)
제휴하지 않습니다 StackOverflow