Использование «this» с именем класса - PullRequest
112 голосов
/ 02 ноября 2010

Я занимаюсь программированием на Android и изучал Intents, когда увидел конструктор, который, на мой взгляд на C #, показался мне в стиле фанк.Вызов был:

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

Оба параметра являются новыми для меня.Какое статическое «.this» от имени класса?Это Java или Android?Я предполагаю, что это то же самое, что просто сказать «это», поскольку я нахожусь в контексте CurrentActivity, но я не понимаю, как «это» можно вызвать из самого имени класса.Также.«.Class» выглядит так, как будто он используется для отражения, с которым я знаком в C #, но любое понимание этого также приветствуется.

Спасибо.

Ответы [ 7 ]

133 голосов
/ 02 ноября 2010

Обычно вы можете использовать только 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);
    }
});
59 голосов
/ 02 ноября 2010

По одному:

Первая конструкция называется , квалифицируемой как .Назначение синтаксиса в том случае, если вы находитесь во внутреннем классе (обычно это анонимный внутренний класс) и хотите сослаться на this внешнего класса, а не на this (анонимного) внутреннего класса.«Квалифицированное это» может использоваться только в контексте, где this будет неоднозначным.Цитата JLS «Это ошибка времени компиляции, если выражение встречается в классе или интерфейсе, который не является внутренним классом класса T или самого T».

Вторая конструкция называется class literalэто способ ссылки на объект Class, который представляет этот тип.Может использоваться в любом контексте.

13 голосов
/ 02 ноября 2010

Синтаксис "Classname.this" предназначен для внутренних классов.Если вы хотите сослаться на включающий экземпляр типа "Outerclass", вы делаете это как "Outerclass.this".

NextActivity.class - это просто объект Class, который описывает класс "NextActivity".

11 голосов
/ 02 ноября 2010

NextActivity.class в Java означает typeof(NextActivity) в C #

8 голосов
/ 02 ноября 2010

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

4 голосов
/ 02 ноября 2010
<ClassName>.this

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

public class Siht {
    class NestedSiht {
        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());
        }
    }

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 голосов
/ 07 сентября 2017

Это сбивает с толку только потому, что когда вы используете " MainActivity.this ", кажется, что вы ссылаетесь на класс, а не на объект.В действительности, когда вы используете «this», вы всегда ссылаетесь на текущий объект, поскольку документация java se гласит:

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

В методе экземпляра или конструкторе, this является ссылкой на текущий объект t - объект, метод или конструктор которого вызывается.С помощью этого вы можете ссылаться на любой член текущего объекта из метода экземпляра или конструктора.

Это просто синтаксически своеобразно.

...