Почему я могу расширить видимость модификаторов доступа в подклассах?

Наверное глупый вопрос, но зачем в Java расширять видимость модификаторов доступа в подклассах? Итак, скажем, у меня есть следующий код:

пакет а:

public class Parent
{
    private String name;

    void setName(String name)
    {
        this.name = name;
    }
}

в том же пакете:

public class Child extends Parent
{
    @Override
    public void setName(String name)
    {
        super.setName(name);
    }
}

И тогда в пакете б я смогу позвонить

Child c = new Child;
c.setName("some-bad-name");

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

Так что в случае, если в Java мы сможем не расширять, а использовать только ту же видимость, что и в суперклассе, я не смогу изменить поле «имя» таким образом. Я знаю о принципе подстановки Лискова, и он объясняет, почему в подклассе я должен использовать модификатор доступа с видимостью не меньше, чем в суперклассе, но я изо всех сил пытаюсь понять, почему я могу его расширить.


person Binary Code    schedule 18.04.2017    source источник
comment
Вы можете задать тот же вопрос о том, почему вы можете добавлять новые методы в подклассы - знаете, родительский класс не должен иметь метод foo(), но подкласс добавляет его. Потому что ты можешь; и поскольку он не менее заметен, чем метод в родительском классе, подкласс можно заменить Лисков.   -  person Andy Turner    schedule 18.04.2017
comment
Но если вы хотите использовать класс Child, вы должны сначала импортировать его! Таким образом, и Parent, и Child остаются в packageA. Но используя импорт, вы получаете к ним доступ из класса в packageB. Это абсолютно правильно. Почему вы боретесь с этим?   -  person Lynx 242    schedule 18.04.2017