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


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

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.



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.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.