Подтвердить что ты не робот

Доступ к закрытым полям суперкласса с использованием ключевого слова super в подклассе

Для проекта кодирования у меня есть класс, содержащий вложенный класс. Вложенный класс подклассифицирован в пределах одного и того же внешнего класса. Цель состоит в том, чтобы внешний класс содержал некоторые экземпляры вложенного класса, которые он может передать другим экземплярам внешнего класса.

Вложенный подкласс позволяет внешнему классу изменять содержимое, в то время как его суперкласс позволяет читать содержимое и вызывать некоторые методы. Таким образом, объекты суперкласса передаются другим объектам для связывания объектов внешнего класса в цепочке.

Вопрос, который у меня есть, касается модификаторов доступа. Вот пример минималистского кода:

abstract class OuterClass {


    protected class NestedSuperClass<T> {
        private T data;

        public NestedSuperClass (T t) {
            this.data = t;
        }

        public T getOutput() {
            return data;
        }
    }

    protected class NestedSubClass<T> extends NestedSuperClass<T> {
        public NestedSubClass (T t) {
            super(t);
        }

        protected void setOutput(T t) {
            super.data = t;
        }
    }
}

При поиске некоторой документации я был смущен возможностью доступа к закрытому полю суперкласса, который нигде не упоминается. Есть ли какой-либо ресурс, объясняющий, почему подклассу разрешено модифицировать частное поле суперкласса таким образом?

Я отлично справляюсь с этой работой. Я также заметил, что он работает с данными, помеченными как защищенные, а не private, и не используя ключевое слово super. Меня больше всего интересует любая документация, в которой упоминается эта способность ключевого слова super. Спасибо заранее.

4b9b3361

Ответ 1

В соответствии с Спецификация языка Java

Пример 6.6-5. Доступ к закрытым полям, методам и конструкторам

Частный член класса или конструктор доступен только внутри тела класса верхнего уровня (§7.6), который включает объявление члена или конструктора. Это не унаследовано подклассами.

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

Однако для частных полей внутренний класс должен использовать super.field для доступа к нему, поскольку он не наследуется (иначе вы получите ошибку компилятора "field не видно" ). Несмотря на то, что он не унаследован, он все еще доступен, потому что внутренний класс находится внутри внешнего класса, а частные поля доступны для чего-либо внутри тела класса верхнего уровня.

Ответ 2

Что вы можете сделать в подклассе

Подкласс наследует все общедоступные и защищенные члены его родителя, независимо от того, в каком пакете находится подкласс. Если подкласс находится в том же пакете, что и его родительский элемент, он также наследует дочерние элементы-члены пакета. Вы можете использовать унаследованные элементы как есть, заменить их, скрыть их или дополнить их новыми членами:

Унаследованные поля могут использоваться напрямую, как и любые другие поля. Вы можете объявить поле в подклассе с тем же именем, что и в суперклассе, тем самым скрывая его (не рекомендуется). Вы можете объявить новые поля в подклассе, которые не находятся в суперклассе. Унаследованные методы могут использоваться напрямую, как есть. Вы можете написать новый метод экземпляра в подклассе, который имеет ту же подпись, что и в суперклассе, тем самым переопределяя его. Вы можете написать новый статический метод в подклассе, который имеет ту же подпись, что и в суперклассе, тем самым скрывая его. Вы можете объявить новые методы в подклассе, которые не находятся в суперклассе. Вы можете написать конструктор подкласса, который вызывает конструктор суперкласса, либо неявно, либо с помощью ключевого слова super. Следующие разделы этого урока будут расширяться по этим темам.

Частные члены в суперклассе

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

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

ссылка: https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

Ответ 3

JLS §6.6.1. Определение доступности (основное внимание):

Элемент (класс, интерфейс, поле или метод) ссылочного типа или конструктор типа класса доступен только в том случае, если тип доступен и член или конструктор объявлен для разрешения доступа:

[...]

В противном случае член или конструктор объявляется закрытым, а доступ разрешен тогда и только тогда, когда он встречается внутри тела класса верхнего уровня, который включает объявление члена или конструктора.

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

Ключевое слово super не требуется для определения доступности. Он также работает без.