Cuál es la diferencia entre Class.this y esto en Java

Hay dos formas de referenciar la instancia de una clase dentro de esa clase. Por ejemplo:

class Person { String name; public void setName(String name) { this.name = name; } public void setName2(String name) { Person.this.name = name; } } 

Uno usa this.name para hacer referencia al campo del objeto, pero el otro usa className.this para hacer referencia al campo del objeto. ¿Cuál es la diferencia entre estas dos referencias?

En este caso, son lo mismo. La syntax Class.this es útil cuando tiene una clase anidada no estática que necesita hacer referencia a la instancia de su clase externa.

 class Person{ String name; public void setName(String name){ this.name = name; } class Displayer { String getPersonName() { return Person.this.name; } } } 

Esta syntax solo se vuelve relevante cuando tienes clases anidadas:

 class Outer{ String data = "Out!"; public class Inner{ String data = "In!"; public String getOuterData(){ return Outer.this.data; // will return "Out!" } } } 

Solo necesita usar className.this para las clases internas. Si no los está usando, no se preocupe.

Class.this es útil para hacer referencia a una OuterClass no estática.

Para crear una instancia de InnerClass no InnerClass , primero debe crear una instancia de OuterClass . Por lo tanto, una InnerClass no InnerClass siempre tendrá una referencia de su OuterClass y todos los campos y métodos de OuterClass están disponibles para InnerClass .

 public static void main(String[] args) { OuterClass outer_instance = new OuterClass(); OuterClass.InnerClass inner_instance1 = outer_instance.new InnerClass(); OuterClass.InnerClass inner_instance2 = outer_instance.new InnerClass(); ... } 

En este ejemplo, ambas Innerclass se instancian desde la misma Outerclass por lo que ambas tienen la misma referencia a Outerclass .