Java中Class.this和this有什么区别?

132

在类中有两种引用该类实例的方式。例如:

class Person {
  String name;

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

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

一个使用 this.name 引用对象字段,但另一个使用 className.this 引用对象字段。这两个引用之间有什么区别?

4个回答

179
在这种情况下,它们是相同的。当您有一个非静态嵌套类需要引用其外部类的实例时,Class.this语法是有用的。
class Person{
    String name;

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

    class Displayer {
        String getPersonName() { 
            return Person.this.name; 
        }

    }
}

3
如果你用“return name”代替“Person.this.name”,那行不行? - Amit G
7
在这个例子中,是的,它会起作用。然而,有时候你需要澄清你正在使用哪个“this”(例如,如果成员变量名或方法名存在冲突)。请参考Michael的答案,其中提供了一个相关的例子。 - jtahlborn
1
一个例子是当你需要将对 Person.this 的引用传递给另一个对象时。 - Bowi

88

只有在存在嵌套类时,这种语法才变得相关:

class Outer{
    String data = "Out!";

    public class Inner{
        String data = "In!";

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

14

只有在使用内部类时才需要使用className.this。如果您没有使用它们,不用担心。


4

Class.this是引用非静态OuterClass的有用方式。

要实例化一个非静态InnerClass,必须首先实例化OuterClass。因此,非静态InnerClass将始终具有对其OuterClass的引用,并且OuterClass的所有字段和方法都可供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();
        ...
}

在这个例子中,两个Innerclass都是从同一个Outerclass实例化的,因此它们都具有对Outerclass的相同引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接