English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этой статье мы рассмотрим примеры использования ключевого слова this в Java, как и где их использовать.
В Java ключевое слово this используется для ссылки на текущий объект в методе или конструкторе. Например,
class Main { int instVar; Main(int instVar){ this.instVar = instVar; System.out.println("Ссылка this= " + this); } public static void main(String[] args) { Main obj = new Main(8); System.out.println("Объектная ссылка= " + obj); } }
Вывод:
Ссылка this = com.ThisAndThat.MyClass@74a14482 Объектная ссылка = com.ThisAndThat.MyClass@74a14482
В данном примере мы создали объект obj класса Main. Затем мы выводим ссылки на объект класса obj и ключевое слово this.
Здесь мы можем видеть, что ссылки obj и this идентичны. Это означает, что это всего лишь ссылка на текущий объект.
В различных ситуациях обычно используется ключевое слово this.
В Java не разрешается в диапазоне (диапазон класса или метода) объявлять две или более переменных с одним и тем же именем. Однако, переменные и параметры могут иметь одно и то же имя. Например,
class MyClass { // Переменная int age; // Параметр MyClass(int age){ age = age; } }
В данном примере переменная и параметр имеют одно и то же имя: age. Здесь из-за неопределенности имен компилятор Java путается.
В данном случае мы используем ключевое слово this. Например,
Сначала давайте рассмотрим пример без использования ключевого слова this:
class Main { int age; Main(int age){ age = age; } public static void main(String[] args) { Main obj = new Main(8); System.out.println("obj.age = " + obj.age); } }
Вывод:
mc.age = 0;
В данном примере мы передали значение 8 в конструктор. Однако, результатом является 0, потому что компилятор Java путается из-за неопределенности имен между переменными и параметрами.
Теперь давайте перезапишем上面的 код с использованием ключевого слова this.
class Main { int age; Main(int age){ this.age = age; } public static void main(String[] args) { Main obj = new Main(8); System.out.println("obj.age = " + obj.age); } }
Вывод:
obj.age = 8
Теперь мы получили ожидаемый результат. Это потому, что при вызове конструктора, содержимое конструктора заменяется объектом, который вызвал конструктор, obj. Поэтому переменная age назначается значением 8.
Кроме того, если имена параметров и переменных экземпляра различаются, компилятор автоматически добавляет ключевое слово this. Например, код:
class Main { int age; Main(int i) { age = i; } }
равносильно:
class Main { int age; Main(int i) { this.age = i; } }
одна из常见的 используемостей ключевого слова this в классеsetter и getter методынапример:
class Main { String name; // setter-метод void setName(String name) { this.name = name; } // getter-метод String getName(){ return this.name; } public static void main(String[] args) { Main obj = new Main(); // вызов setter и getter методов obj.setName("Seagull"); System.out.println("obj.name: " + obj.getName()); } }
Вывод:
obj.name: Seagull
Здесь мы используем ключевое слово this:
ассигнование значений через setter-методы
доступ к значениям через getter-методы
во время обработкипри перегрузке конструкторовВ некоторых случаях нам может потребоваться вызвать один конструктор из другого. В этом случае мы не можем явно вызвать конструктор. Вместо этого我们必须 использовать ключевое слово this.
Здесь мы используем другую форму ключевого слова this. Это также this(). Давайте приведем пример
class Complex { private int a, b; // конструктор с двумя параметрами private Complex(int i, int j){ this.a = i; this.b = j; } // конструктор с одним параметром private Complex(int i){ // вызов конструктора с двумя параметрами this(i, i); } // конструктор без параметров private Complex(){ // вызов конструктора с одним параметром this(0); } @Override public String toString() {}} return this.a + " + " + this.b + "i"; } public static void main(String[] args) { //Создание объекта класса Complex //Вызов конструктора с двумя параметрами Complex c1 = new Complex(2, 3); //Вызов конструктора с одним параметром Complex c2 = new Complex(3); //Вызов конструктора без параметров Complex c3 = new Complex(); //Вывод объекта System.out.println(c1); System.out.println(c2); System.out.println(c3); } }
Вывод:
2 + 3i 3 + 3i 0 + 0i
В上面的 примере мы использовали ключевое слово this:
Вызов конструктора Complex(int i) из конструктора Complex(int i, int j)
Вызов конструктора Complex() из конструктора Complex(int i)
Внимание на эту строку:
System.out.println(c1);
Здесь, когда мы выводим объект c1, объект преобразуется в строку. В этом процессе вызывается toString(). Поскольку мы перегрузили метод toString() в классе, мы получаем вывод на основе этого метода.
Одним из основных преимуществ использования this() является уменьшение количества повторяющегося кода. Однако, используя this(), мы должны быть особенно осторожны.
Это потому, что вызов одного конструктора из другого добавляет издержки и это медленный процесс. Одна из больших преимуществ использования this() — уменьшение количества повторяющегося кода.
Внимание:Вызов одного конструктора из другого конструктора называется явным вызовом конструктора.
Мы можем использовать ключевое слово this для передачи текущего объекта в метод. Например:
class ThisExample { //Объявление переменных int x; int y; ThisExample(int x, int y) { //Назначение значений переменным в конструкторе this.x = x; this.y = y; //Значения x и y до вызова add() System.out.println("До передачи this в метод addTwo():"); System.out.println("x = " + this.x + ", y = " + this.y); //Вызов метода add() с передачей this в качестве аргумента add(this); //Значения x и y после вызова add() System.out.println("После передачи this в метод addTwo():"); System.out.println("x = " + this.x + ", y = " + this.y); } void add(ThisExample o){ o.x += 2; o.y += 2; } } class Main { public static void main(String[] args) { ThisExample obj = new ThisExample(1, -2); } }
Вывод:
До передачи this в метод addTwo(): x = 1, y = -2 После передачи this в метод addTwo(): x = 3, y = 0
В上面的 примере, обратите внимание на следующую строку в конструкторе ThisExample()
add(this);
Здесь мы вызываем метод add() через передачу this в качестве параметра. Поскольку ключевое слово this содержит ссылку на объект класса obj, мы можем изменить значения x и y в методе add().