2009-06-10 3 views
3

저는 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()); 
     } 
    } 
} 

답변

15

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

Java Language Specification§6.6, Access Control 말한다 :

을 ... 회원 또는 생성자 개인 선언 된 경우, 다음 액세스 및 경우 허용 된 경우에만 그것은을 둘러싸는 최상위 클래스 (§7.6)의 신체 내에서 발생하는 경우 멤버 또는 생성자의 선언.

즉, 클래스 내부의 모든 항목은 언제든지 액세스 할 수 있습니다. 중첩 된 클래스조차도 private 멤버 및 생성자를 둘러싸는 클래스에 액세스 할 수 있으며 그 반대의 경우도 마찬가지입니다.

(당신은 그것을 오해하지 혼자, this much-upvoted answer to "What is your longest-held programming assumption that turned out to be incorrect? 체크 아웃)

+0

감사합니다! 나도 PHP를 안다. 그래서 나는 PHP의 private 버전이 실제로 같은 방식으로 작동한다는 것을 확인했다. –

+0

저는 대부분의 객체 지향 언어가 이런 식으로 작동한다고 생각합니다. 나는 C# 및 C++을 알고 있습니다. 분명히 루비와 VB6는 인스턴스 - 프라이빗 변수를 가지고 있으며 Scale은 private [this]를 할 수 있습니다. (링크 된 답변의 주석에서 Ruby, VB6 및 Scala에 대해서만 알고 있습니다.) –

관련 문제