Автор: Widowmaker1984

Вопрос 34 (this и super)

"О чем говорят ключевые слова «this», «super», где и как их можно использовать?"

1. Слова this и super — это два специальных ключевых слова в Java, которые представляют соответственно текущий экземпляр класса и его суперкласса.

1.1. Один из примеров использования this и super — это вызовы конструкторов. Внутри класса для вызова своего конструктора без аргументов используется this(), тогда как super() используется для вызова конструктора без аргументов ("конструктора по умолчанию") суперкласса. Таким способом вызывать можно не только конструктор без аргументов, но и вообще любой другой конструктор, передав ему соответствующие параметры.

1.2. Также this и super в Java используются для обращения к переменным экземпляра класса и его суперкласса. К ним можно обращаться и без префиксов super и this, но только если в текущем блоке такие переменные не перекрываются другими переменными, т.е. если в нем нет локальных переменных с такими же именами, в противном же случае использовать имена с префиксами придется обязательно.

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

1.3. Во внутренних классах с помощью этих слов очень удобно ссылаться на внешний класс, используя форму записи Outer.this для его текущего экземпляра и Outer.super — для его родителя, где Outer имя внешнего класса.

2. Чем this и super похожи:
- И this, и super нестатические переменные, соответственно их нельзя использовать в статическом контексте ( в том числе нельзя использовать в методе main).
- И this, и super могут использоваться внутри конструкторов для вызова других конструкторов по цепочке.
- Внутри конструктора this и super должны стоять выше всех других выражений, в самом начале, иначе компилятор выдаст сообщение об ошибке. Из чего следует, что в одном конструкторе не может быть одновременно и this(), и super().

3. Чем this и super различаются:
- Переменная this ссылается на текущий экземпляр класса, в котором она используется, тогда как super — на текущий экземпляр родительского класса.
- Каждый конструктор при отсутствии явных вызовов других конструкторов неявно вызывает с помощью super() конструктор без аргументов родительского класса, при этом всегда остается возможность явно вызвать любой другой конструктор с помощью либо this(), либо super().

3.1. Имея дело с перегруженными конструкторами, удобно один конструктор вызывать из другого через ключевое слово this. При выполнении конструктора this() сначала выполняется перегруженный конструктор, который соответствует указанному списку параметров. Затем выполняются операторы, находящиеся внутри исходного конструктора, если таковые существуют.

3.1.1. Использование перегруженных конструкторов через конструктор this() позволяет исключить дублирование кода, уменьшая время загрузки классов. Но следует быть осторожным, так как конструкторы, которые вызывают конструктор this(), выполняются немного медленнее.

3.2. При отсутствии других явных вызовов сначала будет выполнен конструктор по умолчанию (без параметров) каждого суперкласса, начиная с базового. По умолчанию они вызываются в порядке подчиненности классов (сверху вниз). В этом есть определенный смысл. Поскольку суперкласс не имеет никакого знания о каком-либо подклассе, любая инициализация, которую ему нужно выполнить, является отдельной. По возможности она должна предшествовать любой инициализации, выполняемой подклассом. Поэтому она и должна выполняться первой.

Комментарии


Лучшее   Правила сайта   Вход   Регистрация   Восстановление пароля

Материалы сайта предназначены для лиц старше 16 лет (16+)