Явная видимость частного поля Java
Итак, я делал класс на днях и использовал метод Eclipse для создания метода equals, когда понял, что он создал следующий рабочий код:
class Test {
private int privateInt;
[...]
public boolean equals(Object obj) {
[...]
Test t = (Test) obj;
if ( t.privateInt == privateInt ) {
[...]
}
}
t.privateInt..???? Предположим, что это личное! Поэтому я предполагаю, что есть еще одна видимость поля, отличная от частной, защищенной, защищенной от пакетов и общедоступной.
Итак, что здесь происходит? Как это называется? Где кто-нибудь будет использовать это? Разве это не разрушает инкапсуляцию? Что, если класс не имел мутатора, и я это изменил? Это происходит и с С++? Это идиома OO? Если нет, то почему Java это сделала?
Как правило, где я могу найти информацию об этом?
Спасибо.
Ответы
Ответ 1
Он доступен из разных экземпляров одного и того же класса.
Согласно эта страница (смелый мой):
На уровне участника вы также можете использовать публичный модификатор или модификатор (private-package), как и классы верхнего уровня, и с тем же значением. Для участников есть два дополнительных модификатора доступа: частный и защищенный. Частный модификатор указывает, что к члену можно получить доступ только в своем классе.
Для ясности я переписал эту строку:
if ( t.privateInt == this.privateInt )
Мы можем согласиться с тем, что "this.privateInt" должно быть разрешено: вы получаете доступ к нему из экземпляра класса Test, к которому отправлено сообщение "равно".
Неясно, что "t.privateInt" должно быть видимым, потому что t является отдельным экземпляром класса Test, и мы не выполняем его метод equals. Однако java допускает это, поскольку оба объекта (t и это) относятся к одному и тому же классу Test и могут видеть частные члены друг друга.
Ответ 2
Майк совершенно прав; вы смешиваете объекты (экземпляры класса) с самим классом. Члены являются закрытыми для класса, а не для конкретного экземпляра класса.
Я помню, как это было так же удивительно, когда я был новичком в Java.
Ответ 3
Вы ссылаетесь на него из одного класса. Таким образом, вы знаете, что делаете и не нуждаетесь в защите от себя.
Ответ 4
Одна большая причина, по которой разрешен доступ к частным членам других экземпляров, заключается в разрешении "копировать" функции - в противном случае они были бы практически невозможны. Кроме того, если вы не разрешаете доступ к другим экземплярам, что бы вы разрешили для статических методов?
Ответ 5
Доступ к закрытым переменным другого экземпляра того же класса. Это связано с тем, что вы имеете дело с реализацией класса, напрямую, что требует, чтобы вы знали о его внутренних переменных 'private' в любом случае.
Ответ 6
Простой ответ на эту путаницу заключается в том, чтобы помнить, что частное поле видимо только и только в классе, где они инициализируются (и определены)... Поэтому, когда вы создаете объект класса внутри класса, вы можете всегда обращайтесь к частному полю этого класса через ссылку на объект. Может быть, вы чувствуете, что это сложно, но просто подумайте, что частное поле подобно публичному полю, когда вы используете его внутри класса, где он определен.