Каковы последствия частного ключевого слова в Java?

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

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 написан в теле самого сложного класса закрытого класса.

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

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


person Debadyuti Maiti    schedule 31.03.2012    source источник
comment
к членам частного экземпляра нельзя получить доступ через ссылку на объект - откуда это взялось?   -  person Mat    schedule 31.03.2012
comment
Идея частного/защищенного состоит в том, чтобы скрыть внутренности от внешнего мира. Нет ничего плохого в том, что класс знает о себе. Ведь это один и тот же класс.   -  person Corbin    schedule 31.03.2012
comment
Откуда это заблуждение? =› «Объектно-ориентированная модель проектирования, закрытые члены экземпляра не могут быть доступны через ссылку на объект»   -  person Mark Rotteveel    schedule 31.03.2012
comment
+1 за хорошо сформулированный вопрос.   -  person Andre    schedule 31.03.2012


Ответы (2)


Короткий ответ заключается в том, что именно так Java определила модификатор доступа private.

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

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

person biziclop    schedule 31.03.2012

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

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

person Peter Lawrey    schedule 31.03.2012
comment
пакет р; открытый класс PTest{ PTest(){ int b=new V().testMe; //не разрешено, хотя определено в том же файле. } } класс V{ private int testMe=5; } - person Debadyuti Maiti; 31.03.2012
comment
Это не совсем так. Он должен читать, что внутренние классы, определенные во внешнем классе, могут получить доступ к закрытым членам любого другого класса, определенного во внешнем классе. Два внешних класса, объявленных в одном файле, не могут получить доступ к закрытым членам друг друга. - person Dunes; 31.03.2012
comment
@Dunes Да. Это правда. Но я не перехожу к обсуждению внутреннего класса. На самом деле Питер сказал, что Примечание: классы в одном файле могут получить доступ к частному члену любого другого класса в этом файле.. Но этого не может быть. Правильно ? - person Debadyuti Maiti; 31.03.2012
comment
Да, Питер, ты должен уточнить это немного. Интересно, что внутренние классы могут обращаться не только к закрытым членам внешнего класса (хорошо известным), но и к закрытым членам других внутренних классов. Таким образом, в основном все, что находится между открывающей и закрывающей фигурными скобками определения класса, может получить доступ к закрытым членам. Звучит не резко, но я думаю, что правильно :) - person Voo; 31.03.2012