Каковы последствия частного ключевого слова в Java? - PullRequest
1 голос
/ 31 марта 2012

Следующий код работает и работает отлично.

public class Complex {

private int real, imag;

Complex(int r, int i) {
    real = r;
    imag = i;
}

public static Complex add(Complex c1, Complex c2) {
    return new Complex(c1.real + c2.real, c1.imag + c2.imag);
}

public String toString() {
    return real + "+i" + imag;
}

public static void main(String[] args) {

    Integer.parseInt("5");
    System.out.println(Complex.add(new Complex(2, 3), new Complex(3, 4)));

}

}

Теперь согласно объектно-ориентированной модели проектирования, частные члены экземпляра не должны быть доступны через ссылку на объект (что было сделано здесь c1.real).

Итак, в этом смысле должна быть ошибка компилятора.Но это не возражает.

Теперь, насколько я понимаю, это разрешено, потому что

  1. c1.real код написан в теле самого частного класса Complex.

  2. Разработчик класса Complex должен иметь доступ ко всем членам экземпляра [будь то частным, защищенным, чем угодно] при доступе через ссылку на объект, поскольку Developer очень хорошо знает, что он делает, в отличие от любой третьей стороны.Вот почему здесь не используется модель объектно-ориентированной модели.

Кто-нибудь может предложить лучшее объяснение того, почему код c1.real здесь разрешен?

Ответы [ 2 ]

4 голосов
/ 31 марта 2012

private означает, что доступ к нему из другого внешнего класса невозможен.Это классовая, а не объектная безопасность.Примечание: классы в том же внешнем классе могут получить доступ к закрытому члену любого другого класса в этом файле.

http://vanillajava.blogspot.co.uk/2012/02/outer-class-local-access.html

0 голосов
/ 31 марта 2012

Краткий ответ: так Java определил модификатор доступа private.

Более длинный ответ заключается в том, что они, вероятно, предполагали, что строгая инкапсуляция имеет смысл только над уровнем исходного файла, поэтому даже внутренний класс может получить доступ к закрытым членам своего внешнего класса (и наоборот): просто не имеет смысла скрывать элементы внутри тот же исходный файл. Если у вас есть доступ к исходному файлу класса, вы можете в любом случае легко изменить любые модификаторы доступа.

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

...