Menggunakan "ini" dengan nama kelas

115

Saya melakukan pemrograman Android dan belajar tentang Intents, ketika saya melihat konstruktor yang, bagi pikiran saya yang terlatih C #, tampak funky. Panggilannya adalah:

Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class);

Kedua parameter tersebut baru bagi saya. Bagaimana cara menonaktifkan ".this" statis dari Nama Kelas? Apakah ini perangkat Java atau Android? Saya berasumsi bahwa itu sama dengan hanya mengatakan "ini", karena saya berada dalam konteks CurrentActivity, tetapi saya tidak mengerti bagaimana "ini" dapat dipanggil dari nama Kelas itu sendiri. Juga. ".Class" sepertinya digunakan untuk refleksi, yang saya kenal di C #, tetapi wawasan apa pun tentang ini akan disambut juga.

Terima kasih.

skaz
sumber

Jawaban:

138

Biasanya, Anda hanya bisa menggunakan this. Tapi, terkadang thismembuat referensi ke kelas dalam ... jadi, misalnya:

Button button = (Button)findViewById(R.id.ticket_details_sell_ticket);
button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // it will be wrong to use only "this", because it would
        // reference the just created OnClickListener object
        Intent login = new Intent(ClassName.this, Login.class);
        startActivityForResult(login, LOGIN_REQUEST);
    }
});
Cristian
sumber
17
Saya melihat. Jadi seandainya saya baru saja mengatakan "ini" di Intent baru dalam contoh Anda, ini akan merujuk ke "ini" dari kelas OnClickListener, tetapi karena saya perlu merujuk kelas luar, saya memerlukan cara untuk menandakannya.
skaz
7
Baik. thisselalu merupakan kelas terdalam.
Falmarri
7
Dan untuk menjawab bagian lain dari pertanyaan: ya, ini masalah java
Decko
1
Saya bertanya-tanya mengapa MyClass.this dan tidak hanya ini di saat mendaftar pendengar! Terima kasih
luigi7up
3
Lucu! Siapa yang tahu bahwa Java thissangat mirip dengan JavaScript this? Saya rasa itulah yang Anda dapatkan karena tidak memiliki fungsi kelas satu atau lambda :-)
Pat
61

Satu per satu:

Konstruksi pertama disebut ini memenuhi syarat . Tujuan sintaks ini adalah jika Anda berada di kelas dalam (biasanya kelas dalam anonim) dan Anda ingin mereferensikan thiskelas luar daripada kelas thisdalam (anonim). Kata "memenuhi syarat ini" hanya dapat digunakan dalam konteks yang thisakan menjadi ambigu. Kutipan JLS "Ini adalah kesalahan waktu kompilasi jika ekspresi terjadi di kelas atau antarmuka yang bukan kelas dalam dari kelas T atau T itu sendiri".

Konstruksi kedua disebut a class literaladalah cara untuk mereferensikan objek Kelas yang mewakili tipe itu. Ini dapat digunakan dalam konteks apa pun.

Yishai
sumber
Perlu dicatat, jika jawaban ini masih belum cukup jelas, itu hanya berfungsi ketika ada kelas tertutup dan Anda mereferensikan kelas luar. Anda tidak bisa begitu saja menggunakan "NotInTheStackOfEnclosings.this".
diego nunes
1
@ DiegoNunes, itu benar dari qualified thisbukan dari class literal. Saya telah memperluas jawaban saya untuk membuatnya lebih jelas.
Yishai
14

Sintaks "Classname.this" adalah untuk kelas dalam. Jika Anda ingin merujuk ke contoh penutup dari tipe "Outerclass" maka Anda melakukannya sebagai "Outerclass.this".

NextActivity.class hanyalah objek Kelas yang mendeskripsikan kelas "NextActivity".

DJClayworth
sumber
11

NextActivity.classdalam bahasa jawa artinya typeof(NextActivity)dalam C #

codymanix.dll
sumber
8

ClassName.this digunakan untuk mereferensikan instance saat ini dari kelas luar dari kelas dalam.

akf
sumber
Dan tentunya sebaliknya?
codymanix
5
<ClassName>.this

digunakan dalam kelas bersarang untuk merujuk ke instance saat ini dari kelas yang melingkupi, karena kata kunci `ini 'merujuk ke instance kelas bersarang.

public class Siht { class NestedSiht { void demoThis () { System . err . println ( " Siht.this 'adalah turunan dari:" + Siht . this . getClass (). getName ()); } }   
      
         
            this' is an instance of: " + 
                            this.getClass().getName());
            System.err.println(" 
                            
        
    

void demoThis() {
    new java.lang.Object() {
        void demoThis() {
            System.err.println("`this' is an instance of: " + 
                            this.getClass().getName());
            System.err.println("`Siht.this' is an instance of: " +
                            Siht.this.getClass().getName());
        }
    }.demoThis();
    new NestedSiht().demoThis();
}

public static void main(String [] args) {
    new Siht().demoThis();
}

}

khachik
sumber
0

Ini membingungkan hanya karena ketika Anda menggunakan " MainActivity.this ", tampaknya Anda merujuk ke kelas dan bukan objeknya. Pada kenyataannya, saat Anda menggunakan "ini", Anda selalu merujuk ke objek saat ini, seperti yang dinyatakan dalam dokumentasi se java:

https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

Di dalam metode instance atau konstruktor, ini adalah referensi ke objek saat ini t - objek yang metode atau konstruktornya dipanggil. Anda dapat merujuk ke anggota mana pun dari objek saat ini dari dalam metode instance atau konstruktor dengan menggunakan ini.

Ini hanya aneh secara sintaksis.

Gaetano
sumber