Sınıf adıyla "bunu" kullanma


115

Android programlama yapıyorum ve C # eğitimli zihnime korkak görünen bir kurucu gördüğümde Amaçları öğreniyordum. Çağrı şöyleydi:

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

Her iki parametre de benim için yeni. Sınıf Adından statik bir ".this" nasıl olur? Bu bir Java şeyi mi yoksa bir Android şeyi mi? Bunun bağlamında olduğum için "bu" demekle aynı olduğunu varsayıyorum CurrentActivity, ancak "bu" nun Sınıf adının kendisinden nasıl çıkarılabileceğini anlamıyorum. Ayrıca. ".Class", C # 'da aşina olduğum yansıma için kullanılıyor gibi görünüyor, ancak bununla ilgili herhangi bir kavrayış da memnuniyetle karşılanacaktır.

Teşekkürler.

Yanıtlar:


138

Genellikle yalnızca kullanabilirsiniz this. Ancak bazen thisbir iç sınıfa atıfta bulunur ... yani, örneğin:

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);
    }
});

17
Anlıyorum. Örneğinizdeki yeni Intent'te "bu" demiş olsaydım, OnClickListener sınıfının "bu" sunu kastediyor olabilirdi, ancak dış sınıfa başvurmam gerektiğinden bunu belirtmek için bir yola ihtiyacım var.
skaz

7
Sağ. thisher zaman en içteki sınıftır.
Falmarri

7
Ve sorunun diğer kısmına cevap vermek gerekirse: evet, bu bir java meselesi
Decko

1
Neden MyClass.th olduğunu merak ediyordum ve sadece bir dinleyiciyi kaydederken bu değil ! Teşekkürler
luigi7up 01

3
Komik! Java'nın thisJavaScript'lere çok benzediğini kim bilebilirdi this? Sanırım birinci sınıf işlevlere veya lambdalara sahip olmadığınız için elde edeceğiniz şey bu :-)
Pat

61

Teker teker:

İlk yapı buna nitelikli denir . Sözdiziminin amacı, bir iç sınıfta (tipik olarak anonim bir iç sınıf) olmanız ve (anonim) iç sınıfın thisyerine dış sınıfın referansını almak istemenizdir this. "Nitelikli bu" yalnızca thisbelirsiz olacağı bir bağlamda kullanılabilir . JLS'den alıntı "İfade, T veya T sınıfının kendi iç sınıfı olmayan bir sınıf veya arayüzde ortaya çıkarsa, bu bir derleme zamanı hatasıdır".

İkinci yapı, a olarak adlandırılır class literal, bu türü temsil eden Class nesnesine başvurmanın yoludur. Herhangi bir bağlamda kullanılabilir.


Bu cevap hala yeterince net değilse, yalnızca kapalı bir sınıf olduğunda ve bir dış sınıfa atıfta bulunduğunuzda işe yarayacağını belirtmek gerekir. "NotInTheStackOfEnclosings.this" kullanamazsınız.
diego nunes

1
Doğrudur @DiegoNunes, qualified thisdeğil class literal. Bunu daha net hale getirmek için cevabımı genişlettim.
Yishai

14

"Classname.this" sözdizimi iç sınıflar içindir. "Outerclass" türünün çevreleyen örneğine başvurmak istiyorsanız, bunu "Outerclass.this" olarak yaparsınız.

NextActivity.class, "NextActivity" sınıfını tanımlayan Class nesnesidir.


11

NextActivity.classJava'da typeof(NextActivity)C # anlamına gelir


8

ClassName.this bir iç sınıftan bir dış sınıfın geçerli örneğine başvurmak için kullanılır.


Ve kesinlikle tam tersi?
codymanix

5
<ClassName>.this

Bu 'anahtar sözcüğü yuvalanmış sınıf örneğini ifade ettiğinden, yuvalanmış sınıflarda, çevreleyen sınıfın geçerli örneğini belirtmek için kullanılır.

public class Siht { class Siht {  
    class NestedSiht {class NestedSiht {  
        void demoThis () {void demoThis () { 
            System.err.println (" Siht.this 'şunun bir örneğidir:" +Sistem . err . println ( " +this' is an instance of: " + 
                            this.getClass().getName());
            System.err.println(" 
                            . Siht.this.getClass () getName ());Siht . bu . getClass (). getName ());
        }}
    }}

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();
}

}


0

Bu kafa karıştırıcı çünkü " MainActivity.this " kullandığınızda , nesneye değil sınıfa atıfta bulunduğunuz görülüyor. Gerçekte, "bu" u kullandığınızda, java se belgelerinin belirttiği gibi, her zaman mevcut nesneye atıfta bulunursunuz:

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

Bir örnek yöntemi veya yapıcı içinde bu , yöntemi veya yapıcısı çağrılan nesne olan geçerli nesneye bir referanstır . Bunu kullanarak bir örnek yöntemi veya bir yapıcı içinden geçerli nesnenin herhangi bir üyesine başvurabilirsiniz.

Sözdizimsel olarak tuhaf.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.