Почему клон может установить личное поле на другом объекте? - PullRequest
3 голосов
/ 10 июня 2009

Я изучаю 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());
        }
    }
}

1 Ответ

16 голосов
/ 10 июня 2009

Модификатор private не означает, что только один и тот же экземпляр может получить доступ к полю; это означает, что только объекты одного класса могут получить к нему доступ.

Спецификация языка Java говорит в §6.6, Контроль доступа :

... если член или конструктор объявлен закрытым, тогда доступ разрешается, если и только если он происходит в теле класса верхнего уровня (§7.6) , который включает в себя объявление члена или конструктор.

Другими словами, все внутри класса может получить к нему доступ в любое время. Даже вложенные классы могут получать доступ к private членам и конструкторам во включающем классе, и наоборот.

(Вы не одиноки в неправильном понимании этого; посмотрите этот часто задаваемый ответ на вопрос: «Каково ваше давнее предположение о программировании, которое оказалось неверным? )

...