this

this — это объект самого себя, представляющий сам объект. Это можно понять так:указатель на сам объект。

Использование this в Java можно условно разделить на 3 типа:

1. Обычная прямая ссылка

Не нужно подробно останавливаться на этом; this эквивалентно указанию на текущий объект.

2. Когда формальные параметры имеют то же имя, что и члены класса, используйте this для различения:

Пример

class Person { private int age = 10; public Person(){ System.out.println("Инициализировать age:"+age); } public int GetAge(int age){ this.age = age; return this.age; } } public class test1 { public static void main(String[] args) { Person Harry = new Person(); System.out.println("Возраст Harry: "+Harry.GetAge(12)); } }

Вывод:

初始化年龄:10
Harry's age is 12

Видно, что здесь age — это формальный параметр метода-члена GetAge, а this.age — переменная-член класса Person.

3. Обращение к конструкторам

Это будет рассмотрено вместе с super, см. ниже.


super

super можно понимать как указатель на объект его суперкласса (родительского класса), и этот суперкласс ссылается на ближайший родительский класс.

У super также есть три варианта использования:

1. Обычная прямая ссылка

Аналогично this, super эквивалентен указанию на родительский класс текущего объекта, поэтому можно использоватьsuper.xxxдля ссылки на члены родительского класса.

2. Когда переменные-члены или методы в подклассе имеют такое же имя, как в родительском классе

Пример

class Country { String name; void value() { name = "China"; } } class City extends Country { String name; void value() { name = "Shanghai"; super.value(); //Вызовите метод родительского класса System.out.println(name); System.out.println(super.name); } public static void main(String[] args) { City c=new City(); c.value(); } }

Вывод:

Shanghai
China

Видно, что здесь вызываются и метод родительского класса, и переменная родительского класса. Если не вызывать метод value() родительского класса, а обратиться только к переменной name родительского класса, то переменная name родительского класса будет иметь значение по умолчанию null.

3. Обращение к конструкторам

  • super(parameters): Вызвать конструктор в родительском классе (должно быть первым оператором в конструкторе).
  • this(parameters): Вызвать другую форму конструктора в этом классе (должно быть первым оператором в конструкторе).

Пример

class Person { public static void prt(String s) { System.out.println(s); } Person() { prt("Родительский класс — конструктор без аргументов:"+"Человек."); }//Конструктор (1) Person(String name) { prt("Родительский класс — конструктор с одним параметром:"+"Имя человека — " + name); }//Конструктор (2) } public class Chinese extends Person { Chinese() { super(); //Вызвать конструктор родительского класса (1) prt("Подкласс — вызывает «конструктор родительского класса без аргументов»:"+"Китайский программист."); } Chinese(String name) { super(name);//Вызов конструктора родительского класса с теми же формальными параметрами (2) prt("Подкласс — вызывает «конструктор родительского класса с одним параметром»:"+"его имя — " + name); } Chinese(String name, int age) { this(name);//Вызов конструктора с теми же формальными параметрами (3) prt("Подкласс: вызывает конструктор подкласса с теми же формальными параметрами: его возраст —" + age); } public static void main(String[] args) { Chinese cn = new Chinese(); cn = new Chinese("codersai"); cn = new Chinese("codersai", 18); } }

Вывод:

父类·无参数构造方法: 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