Использование «этого» в имени класса

115

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

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

Оба параметра для меня новы. Как возникает статический ".this" в имени класса? Это 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);
    }
});
Cristian
источник
17
Понимаю. Итак, если бы я только что сказал «это» в новом намерении в вашем примере, это было бы ссылкой на «это» класса OnClickListener, но поскольку мне нужно ссылаться на внешний класс, мне нужен способ обозначить это.
сказ
7
Правильно. thisвсегда самый внутренний класс.
Falmarri
7
И чтобы ответить на другую часть вопроса: да, это java-штука
Decko
1
Мне было интересно, почему MyClass.this, а не только this, при регистрации слушателя! Спасибо
luigi7up 01
3
Веселая! Кто знал, что Java thisтак похожа на JavaScript this? Я думаю, это то, что вы получаете, если у вас нет первоклассных функций или лямбд :-)
Пэт
61

Один за раз:

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

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

Ишай
источник
Стоит отметить, что если этот ответ все еще недостаточно ясен, он работает только тогда, когда есть закрытый класс, и вы ссылаетесь на внешний класс. Вы просто не можете использовать NotInTheStackOfEnclosings.this.
diego nunes
1
@DiegoNunes, это верно qualified thisне для class literal. Я расширил свой ответ, чтобы прояснить это.
Ишай
14

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

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

DJClayworth
источник
11

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

codymanix
источник
8

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

АКФ
источник
И уж точно наоборот?
codymanix 02
5
<ClassName>.this

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

открытый класс Siht { class NestedSiht { void demoThis ()   
      
          { System . эээ . println ( " Siht.this 'является экземпляром:" + 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();
}

}

Хачик
источник
0

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

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

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

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

Гаэтано
источник