Модификаторы доступа и скрытие полей Java

Это продолжение вопроса: "модификаторы доступа к Java и переопределение". Однако первый обычно имеет дело с методами Java. Почему гибкость с полями Java? Мы можем сузить или расширить видимость с их учетом в унаследованном классе, но не можем с помощью «переопределенного» или «скрытого» метода.


person yesilupper    schedule 28.07.2011    source источник
comment
Пожалуйста, дайте ссылку на этот вопрос   -  person adarshr    schedule 29.07.2011
comment
поля не перезаписываются. Они просто скрыты.   -  person Kal    schedule 29.07.2011
comment
спасибо adarshr stackoverflow.com/questions/6851612/   -  person yesilupper    schedule 29.07.2011
comment
обновлен заголовок предыдущего вопроса, чтобы отразить методы(), поскольку скрытие полей, похоже, избегается: stackoverflow.com/questions/6851612/   -  person yesilupper    schedule 29.07.2011
comment
Похоже, что речь идет не о сокрытии/переопределении модификаторов доступа. Я только что попытался скрыть методы, и применяются те же правила видимости. Я все еще не могу уменьшить видимость унаследованного статического метода(). В чем разница между полями и методами()?   -  person yesilupper    schedule 29.07.2011
comment
comment
@double-beep Этот вопрос о методах, а этот о полях. Это не дубликат.   -  person Mark Rotteveel    schedule 13.05.2019


Ответы (2)


Вы никогда не переопределяете поля с самого начала — вы всегда их скрываете. Поля не полиморфны... другими словами, если вы пишете:

Superclass x = new Subclass();
System.out.println(x.field);

и оба Superclass и Subclass объявляют поле с именем field, оно всегда будет использовать суперкласс в любом случае, потому что это все, что компилятор может «видеть».

Лично я все равно стараюсь держать свои переменные в секрете...

person Jon Skeet    schedule 28.07.2011
comment
Это одна из многих причин, по которой я люблю свойства в .Net — они выглядят и ощущаются как поля, но все же могут быть полиморфными. - person Ken Wayne VanderLinde; 29.07.2011

почему гибкость с полями java

Вы не можете сделать поле в другом классе частным, расширив его. Когда вы создаете новое поле в подклассе, вы просто скрываете поле суперкласса.

class Base {
    protected int x;
}

class Ext extends Base {
    private int x; // not the same as Base.x
}
person dacwe    schedule 28.07.2011
comment
Конечно, вы можете сделать поле приватным. Я думаю, вы имеете в виду, что не можете изменить доступ к полю в базовом классе, предоставив приватное поле в подклассе... но я предлагаю вам уточнить свой ответ. - person Jon Skeet; 29.07.2011