Это продолжение вопроса: "модификаторы доступа к Java и переопределение". Однако первый обычно имеет дело с методами Java. Почему гибкость с полями Java? Мы можем сузить или расширить видимость с их учетом в унаследованном классе, но не можем с помощью «переопределенного» или «скрытого» метода.
Модификаторы доступа и скрытие полей Java
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
Возможный дубликат при переопределении метод, почему я могу увеличить доступ, но не уменьшить его?
- person double-beep   schedule 12.05.2019
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
Это одна из многих причин, по которой я люблю свойства в .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
Конечно, вы можете сделать поле приватным. Я думаю, вы имеете в виду, что не можете изменить доступ к полю в базовом классе, предоставив приватное поле в подклассе... но я предлагаю вам уточнить свой ответ.
- person Jon Skeet; 29.07.2011