Я знаю он возвращает ссылку на текущий объект, и с его помощью можно разрешить конфликт локальных и глобальных имен, например в конструкторе. Но какие есть более практичные применения?
В общем применение оператора this можно обобщить до следующего:
К примерам. Использование this в конструкторе:
class Person{
String name;
int old;
int id;
Person(String name, int old){
this.name = name;//Здесь мы получаем доступ к не статичному полю класса
this.old = old; // Здесь мы получаем доступ полю класса
}
}
Пример вызова конструктора из конструктора:
Person (String name, int old, int id){
this(name, old);
this.id = id;
}
Здесь мы получаем доступ к не статичному полям класса. В методах типа equals ():
@Override
public boolean equals(Object obj) {
if(obj == null) return false;
Person other = (Person) obj;
if(this.old == other.old && this.name.equals(other.name))
return true;
return false;
}
Для создания потока:
class MyThread implements Runnable{
String name;
Thread t;
public MyThread(String name){
this.name = name;
t=new Thread(this); /* Здесь мы передаем экземпляр класса,
в котором будут разворачиваются действо. */
t.setName(name);
t.start();
}
public void run(){
for (int i = 0; i < 5; i++) {
System.out.println(name+": "+i);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
System.out.println(e);
return;
}
}
}
}
Для получения аннотаций:
Annotation [] getAnnotation (){
return this.getClass().getAnnotations();
}
И множество других примеров использования.
Например паттерн Builder почти во всех методах для возврата того же объекта использует везде this.
Например, когда внутри метода текущего объекта класса нужно передать текущий объект (this) в метод другого класса.
Пример:
class Example {
public static void main (String[] args) throws java.lang.Exception {
Point p = new Point();
p.moveTo(1, 1);
System.out.println(p); // 1x1
Utils.plus(p, 2, -1);
System.out.println(p); // 3x0
}
}
class Point {
int x;
int y;
public void moveTo(int x, int y) {
Utils.plus(this, x, y);
}
public String toString() {
return String.format("%sx%s", x, y);
}
}
class Utils {
public static void plus(Point p1, int x, int y) {
p1.x += x;
p1.y += y;
}
}
Доступ к начинке внутренних нестатических классов: Vehicle.this.run();...
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости