Class.this와 Java의 차이점은 무엇입니까


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를 참조하는 데 사용하고 다른 하나는 개체 필드 를 참조하는 데 사용 합니다. 이 두 참조의 차이점은 무엇입니까?

답변:


165

이 경우 동일합니다. 이 Class.this구문은 외부 클래스의 인스턴스를 참조해야하는 비 정적 중첩 클래스가있을 때 유용합니다.

class Person{
    String name;

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

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

    }
}

2
Person.this.name 대신 "return name"이라고 말하면 작동하지 않습니까?
Amit G

7
@Amit G-이 예에서는 작동합니다. 그러나 어떤 "this"를 사용하고 있는지 명확히해야하는 경우가 있습니다 (예 : 멤버 변수 이름 또는 메소드 이름에 충돌이있는 경우). 관련 예는 Michael의 답변을 참조하십시오.
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먼저 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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.