Видимость частного поля Java - PullRequest
17 голосов
/ 23 ноября 2008

Итак, я делал урок на днях и использовал метод Eclipse для создания метода equals, когда понял, что он генерирует следующий рабочий код:

class Test {
  private int privateInt;
  [...]
  public boolean equals(Object obj) {
    [...]
    Test t = (Test) obj;
    if ( t.privateInt == privateInt ) {
    [...]
  }
}

t.privateInt .. ???? Это должно быть приватно! Поэтому я думаю, что есть еще одна видимость поля, отличная от приватной, защищенной, защищенной и общедоступной.

Так что здесь происходит? Как это называется? Где бы это кто-нибудь использовал? Не нарушает ли это инкапсуляцию? Что, если в классе не было мутатора, и я изменил это? Это также происходит с C ++? Это идиома OO? Если нет, то почему Java это сделала?

Вообще, где я могу найти информацию об этом?

Спасибо.

Ответы [ 6 ]

24 голосов
/ 23 ноября 2008

Доступно из разных экземпляров одного и того же класса.

Согласно этой странице (шахтное поле):

На уровне члена вы также можете использовать открытый модификатор или не использовать модификатор (package-private) так же, как с классами верхнего уровня, и с тем же значением. Для участников есть два дополнительных модификатора доступа: приватный и защищенный. Модификатор private указывает, что член может быть доступен только в его собственном классе.

Для ясности перепишу эту строку:

if ( t.privateInt == this.privateInt )

Мы можем согласиться с тем, что "this.privateInt" должен быть разрешен: вы обращаетесь к нему из экземпляра класса Test, которому было отправлено сообщение "equals".

Менее ясно, что «t.privateInt» должен быть видимым, потому что t является отдельным экземпляром класса Test, и мы не выполняем его метод equals. Однако java допускает это, поскольку оба объекта (t и this) принадлежат к одному и тому же классу Test и могут видеть приватные члены друг друга.

4 голосов
/ 23 ноября 2008

Майк совершенно прав; Вы путаете объекты (экземпляры класса) с самим классом. Члены являются частными для класса , а не для какого-либо конкретного экземпляра класса.

Я помню, что так же удивлялся этому, когда был новичком в Java.

3 голосов
/ 09 декабря 2011

Одна большая причина, по которой доступ к закрытым членам других экземпляров разрешен, - это разрешение «копировать» функции - в противном случае они были бы практически невозможны. Кроме того, если бы вы не разрешали доступ другим экземплярам, ​​что бы вы допустили для статических методов?

3 голосов
/ 23 ноября 2008

Вы ссылаетесь на него из того же класса. Таким образом, вы знаете, что делаете, и вам не нужно защищаться от себя.

1 голос
/ 23 ноября 2008

Доступ к закрытым переменным другого экземпляра того же класса. Это потому, что вы имеете дело с реализацией класса напрямую, что в любом случае требует, чтобы вы знали о его внутренних, «частных» переменных.

0 голосов
/ 31 июля 2009

Простой ответ на эту путаницу состоит в том, чтобы помнить, что закрытое поле видно только и только в классе, где они инициализируются (и определяются) .... Поэтому, когда вы создаете объект класса внутри класса, вы можете всегда обращайтесь к закрытому полю этого класса через ссылку на объект. Может быть, вы чувствуете, что это трудно, но просто думаете, что приватное поле похоже на публичное поле, когда вы используете его внутри класса, в котором оно определено.

...