2009-06-10 8 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 на самом деле работает одинаково. –

+0

Я думаю, что большинство объектно-ориентированных языков работают таким образом. Я знаю, что C# и C++ делают. По-видимому, Ruby и VB6 имеют частные переменные экземпляра, а Scale может делать 'private [this]', но это все, что я знаю об этой работе, наоборот. (Я знаю только о Ruby, VB6 и Scala из комментариев в связанном ответе.) –

 Смежные вопросы

  • Нет связанных вопросов^_^