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


121

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

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引用对象字段。这两个参考之间有什么区别?

Answers:


165

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

class Person{
    String name;

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

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

    }
}

2
如果您只是说“ return name”而不是Person.this.name,那将不起作用吗?
阿米特G

7
@Amit G-在此示例中,是的,它将起作用。但是,有时需要澄清您使用的是“ this”(例如,如果成员变量名称或方法名称存在冲突)。请参阅迈克尔的答案以获取相关示例。
jtahlborn 2011年

1
一个示例就是您必须引用Person.this另一个对象。
Bowi

85

仅当您具有嵌套类时,此语法才有意义:

class Outer{
    String data = "Out!";

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

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

13

您只需要对内部类使用className.this。如果您不使用它们,请不要担心。


4

Class.this引用非静态很有用OuterClass

要实例化非静态对象InnerClass,必须首先实例化.static 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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.