2008-11-23 3 views
17

Так что я делать класс другой день и использовал метод в Eclipse создать метод Equals, когда я понял, что он был создан следующий рабочий код:Java Private поле Видимость

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

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

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

Как я могу найти информацию об этом?

спасибо.

ответ

24

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

Согласно this page (Bolding шахты):

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

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

if (t.privateInt == this.privateInt) 

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

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

+0

ОК ... Я понимаю сейчас ... Но ПОЧЕМУ? Почему Java допустила это? Можете ли вы придумать примеры реальной жизни. Я понимаю, почему он должен работать на равных. Но должен быть лучший пример. – pek 2008-11-26 15:20:04

+0

Единственные другие примеры были бы похожи на равные, где вам дается другой экземпляр вашего класса в качестве аргумента. Что касается того, почему Java это сделал, он довольно стандартный в языках OO - C++ работает одинаково. Перегрузка == в C++: http://artis.imag.fr/~Xavier.Decoret/resources/C++/operator==.html – 2008-11-26 16:37:10

3

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

4

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

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

1

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

0

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

3

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

Смежные вопросы