Використання "цього" з назвою класу


115

Я займаюся програмуванням на Android і дізнавався про «Інтенти», коли побачив конструктор, який, на мій навчений C # розум, здався дивним. Дзвінок був:

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

Обидва параметри для мене нові. Як існує статичний ".th" від назви класу? Це річ Java або Android? Я припускаю, що це те саме, що просто сказати "це", оскільки я перебуваю в контексті CurrentActivity, але я не розумію, як "це" можна відкликати від самої назви класу. Також. ".Class" виглядає так, що він використовується для роздумів, з яким я знайомий у C #, але будь-яке розуміння цього також буде вітатися.

Дякую.

Відповіді:


138

Зазвичай, ви можете використовувати тільки this. Але іноді thisпосилається на внутрішній клас ... так, наприклад:

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
Я бачу. Так якби я щойно сказав «це» у новому Намірі у вашому прикладі, він би посилався на «це» класу OnClickListener, але оскільки мені потрібно посилатися на зовнішній клас, мені потрібен спосіб, щоб це позначити.
сказ

7
Правильно. thisзавжди найглибший клас.
Falmarri

7
І щоб відповісти на іншу частину запитання: так, справа в
яві

1
Мені було цікаво, чому MyClass.this і не тільки це при реєстрації слухача! Спасибі
luigi7up

3
Смішно! Хто знав, що Java thisнастільки схожі на JavaScript this? Я думаю, це те, що ти не маєш функцій першокласного чи лямбда :-)
Пат

61

По одному:

Перша конструкція називається кваліфікованою . Призначення синтаксису полягає в тому випадку, коли ви перебуваєте у внутрішньому класі (як правило, анонімний внутрішній клас) і хочете посилатися thisна зовнішній клас, а не thisна (анонімний) внутрішній клас. "Кваліфіковано це" можна використовувати лише в контексті, де thisбуло б неоднозначно. Цитата JLS "Це помилка часу компіляції, якщо вираз відбувається в класі або інтерфейсі, який не є внутрішнім класом класу T або самого T".

Друга конструкція називається a class literal- це спосіб посилання на об'єкт Class, який представляє цей тип. Його можна використовувати в будь-якому контексті.


Варто зауважити, якщо ця відповідь все ще не ясно зрозуміла, що вона працює лише тоді, коли є закритий клас і ви посилаєтесь на зовнішній клас. Ви просто не можете використовувати "NotInTheStackOfEnclosings.this".
diego nunes

1
@DiegoNunes, це правда qualified thisне з class literal. Я розширив свою відповідь, щоб зробити це зрозумілішим.
Yishai

14

Синтаксис "Classname.this" призначений для внутрішніх класів. Якщо ви хочете посилатися на примірник, що додається, типу "Outerclass", ви робите це як "Outerclass.this".

NextActivity.class - це просто об'єкт класу, який описує клас "NextActivity".



8

ClassName.this використовується для посилання на поточний екземпляр зовнішнього класу з внутрішнього класу.


І звичайно навпаки?
кодиманікс

5
<ClassName>.this

використовується в вкладених класах для посилання на поточний екземпляр класу, що вкладається, оскільки ключове слово `this 'відноситься до екземпляра класу gnest.

громадський клас Siht { клас Сіхт {  
    клас NestedSiht {клас NestedSiht {  
        void demoThis () {void demoThis () { 
            System.err.println (" Siht.this" є примірником: "+Система . еее . println ( " +this' is an instance of: " + 
                            this.getClass().getName());
            System.err.println(" 
                            Siht.this.getClass (). GetName ());Сіхт . це . 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

Це заплутано лише тому, що при використанні " MainActivity.this ", здається, ви посилаєтесь на клас, а не на об'єкт. Насправді, коли ви використовуєте "це", ви завжди посилаєтесь на поточний об'єкт, як зазначено в документації java se:

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

У методі екземпляра або конструкторі це посилання на поточний об'єкт - об'єкт, метод чи конструктор якого викликається. Ви можете звернутися до будь-якого члена поточного об'єкта з методу екземпляра або конструктора, скориставшись цим.

Це просто синтаксично своєрідно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.