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


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.