Apa perbedaan antara Class.this dan ini di Java


121

Ada dua cara untuk mereferensikan instance kelas dalam kelas itu. Sebagai contoh:

class Person {
  String name;

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

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

Satu menggunakan this.nameuntuk mereferensikan bidang objek, tetapi yang lain menggunakan className.thisuntuk mereferensikan bidang objek. Apa perbedaan antara kedua referensi ini?

Jawaban:


165

Dalam hal ini, keduanya sama. The Class.thissintaks berguna bila Anda memiliki kelas bersarang non-statis bahwa kebutuhan untuk merujuk pada contoh kelas luarnya ini.

class Person{
    String name;

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

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

    }
}

2
Jika bukannya Person.this.name Anda hanya mengatakan "nama kembali" apakah itu tidak akan berhasil?
Amit G

7
@Amit G - dalam contoh ini, ya, ini akan berhasil. namun, ada kalanya Anda perlu mengklarifikasi "ini" yang Anda gunakan (misalnya, jika ada konflik dalam nama var anggota atau nama metode). lihat jawaban Michael untuk contoh yang relevan.
jtahlborn

1
Salah satu contohnya adalah ketika Anda harus memberikan referensi ke Person.thisobjek lain.
Bowi

85

Sintaks ini hanya menjadi relevan jika Anda memiliki kelas bertingkat:

class Outer{
    String data = "Out!";

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

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

13

Anda hanya perlu menggunakan className.this untuk kelas dalam. Jika Anda tidak menggunakannya, jangan khawatir.


4

Class.thisberguna untuk referensi yang tidak statis OuterClass.

Untuk membuat instance nonstatic InnerClass, Anda harus membuat instance OuterClass. Oleh karena itu, nonstatic InnerClassakan selalu memiliki referensi OuterClassdan semua bidang serta metode OuterClasstersedia untuk 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();
        ...
}

Dalam contoh ini keduanya Innerclassdibuat instance-nya dari yang sama Outerclasssehingga keduanya memiliki referensi yang sama ke Outerclass.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.