this
this — это объект самого себя, представляющий сам объект. Это можно понять так:указатель на сам объект。
Использование this в Java можно условно разделить на 3 типа:
1. Обычная прямая ссылка
Не нужно подробно останавливаться на этом; this эквивалентно указанию на текущий объект.
2. Когда формальные параметры имеют то же имя, что и члены класса, используйте this для различения:
Пример
Вывод:
初始化年龄:10 Harry's age is 12
Видно, что здесь age — это формальный параметр метода-члена GetAge, а this.age — переменная-член класса Person.
3. Обращение к конструкторам
Это будет рассмотрено вместе с super, см. ниже.
super
super можно понимать как указатель на объект его суперкласса (родительского класса), и этот суперкласс ссылается на ближайший родительский класс.У super также есть три варианта использования:
1. Обычная прямая ссылка
Аналогично this, super эквивалентен указанию на родительский класс текущего объекта, поэтому можно использоватьsuper.xxxдля ссылки на члены родительского класса.
2. Когда переменные-члены или методы в подклассе имеют такое же имя, как в родительском классе
Пример
Вывод:
Shanghai China
Видно, что здесь вызываются и метод родительского класса, и переменная родительского класса. Если не вызывать метод value() родительского класса, а обратиться только к переменной name родительского класса, то переменная name родительского класса будет иметь значение по умолчанию null.
3. Обращение к конструкторам
- super(parameters): Вызвать конструктор в родительском классе (должно быть первым оператором в конструкторе).
- this(parameters): Вызвать другую форму конструктора в этом классе (должно быть первым оператором в конструкторе).
Пример
Вывод:
父类·无参数构造方法: A Person. 子类·调用父类”无参数构造方法“: A chinese coder. 父类·含一个参数的构造方法: A person's name is codersai 子类·调用父类”含一个参数的构造方法“: his name is codersai 父类·含一个参数的构造方法: A person's name is codersai 子类·调用父类”含一个参数的构造方法“: his name is codersai 子类:调用子类具有相同形参的构造方法:his age is 18
Из этого примера видно, что super и this можно использовать для вызова конструктора родительского класса и других форм конструкторов в этом классе соответственно.
В примере третий конструктор класса Chinese вызывает второй конструктор этого класса, а второй конструктор вызывает конструктор родительского класса. Следовательно, сначала должен быть вызван конструктор родительского класса, затем второй конструктор этого класса, и наконец третий конструктор перезаписывается.
Сходства и различия между super и this
- super(parameters): вызов конструктора в базовом классе (должен быть первым оператором в конструкторе)
- this(parameters): вызов другой формы конструктора в этом классе (должен быть первым оператором в конструкторе)
- super: ссылается на члены в непосредственном родительском классе текущего объекта (используется для доступа к данным-членам или функциям родительского класса, скрытым в непосредственном родительском классе. Когда базовый класс и производный класс имеют одинаковые определения членов, например, super.variableName super.memberFunctionName(actual parameters)). this: представляет имя текущего объекта (там, где в программе легко возникает неоднозначность, используйте this для указания текущего объекта; если формальные параметры функции имеют то же имя, что и данные-члены в классе, используйте this для указания имени переменной-члена).
- Вызов super() должен быть записан первой строкой конструктора подкласса, иначе компиляция завершится неудачно. Первый оператор каждого конструктора подкласса неявно вызывает super(). Если в родительском классе нет конструктора такой формы, при компиляции будет выдана ошибка.
- super() и this() похожи. Различие в том, что super() вызывает конструктор родительского класса из подкласса, а this() вызывает другие методы внутри того же класса.
- И super(), и this() должны быть помещены первой строкой в конструкторе.
- Хотя this можно использовать для вызова одного конструктора, нельзя вызвать два.
- this и super не могут одновременно присутствовать в конструкторе, потому что this неизбежно вызовет другой конструктор, а в том другом конструкторе неизбежно будет оператор super. Следовательно, наличие того же оператора в том же конструкторе лишает оператор смысла, и компилятор это не пропустит.
- И this(), и super() ссылаются на объекты, поэтому их нельзя использовать в статическом окружении. Включая: статические переменные, статические методы, статические блоки операторов.
- По сути, this — это указатель на данный объект, тогда как super — ключевое слово Java.
Оригинальная ссылка: https://www.cnblogs.com/hasse/p/5023392.html