Вы не можете ограничить доступ, потому что вы уже разрешили доступ в суперкласс. например
SuperClass sc = new SubClass();
sc.foo(); // is package local, not private.
Доступ sc
определяется типом ссылки sc
не то, что он ссылается, потому что это невозможно для компилятора знать во всех случаях, какой тип объекта является во время выполнения. Для того чтобы это было безопасное предположение, подкласс должен выполнять контракт, предоставленный родителем, или он не может быть допустимым подклассом. Это ничем не отличается от родителя, говорящего о том, что метод реализован, но подкласс, говорящий, что он не является (или недоступен)
Вы можете обойти это, сказав, что вы можете обращаться к методу подкласса только через родительский, а не непосредственно. Проблема заключается в том, что вы не знаете, когда родитель может добавить метод, и когда вы делаете метод private
, вы делаете это, потому что хотите, чтобы он был закрытым и недоступным другим способом.
BTW Вы можете получить доступ к приватному методу с помощью отражения, которое имеет побочный эффект, вызывающий всевозможные проблемы для JVM. например он должен поддерживать частные методы, даже если он может определить, что его нельзя назвать нормальным.
Короче говоря, вы хотите, чтобы код означал, что он говорит, и не имеет раздвоения личности. Это либо локальный пакет, либо он не является частным, а не чем-то вроде промежутка между ними, но не очень. Это не такая проблема. то есть, если подкласс является общедоступным. Это просто означает, что подкласс может использоваться в большем количестве мест, чем родительский, так же как он может реализовать больше методов.
Интересный вопрос! Этот самый случай * разрешен в C++. – quamrana
«У меня есть класс, у которого есть метод, спецификатор доступа по умолчанию является общедоступным». Фактически спецификатор доступа по умолчанию не является общедоступным. Если вы не указали какой-либо конкретный спецификатор доступа, то он «по умолчанию» :). – pikrut
@quamrana И что происходит на C++, когда вы присоединяетесь к объекту через переменную типа суперкласса? Компилятор, конечно же, пропустил его ... это ошибка во время выполнения? –