Использование "this" с именем класса
Я занимаюсь программированием на базе Android и узнал о намерениях, когда увидел конструктора, который, к моему обученному умению С#, казался напуганным. Вызов:
Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class);
Оба параметра для меня новы. Как происходит статическое ".this" от имени класса? Это вещь Java или Android? Я предполагаю, что это то же самое, что просто сказать "this", так как я в контексте CurrentActivity
, но я не понимаю, как можно отключить "this" от имени класса. Также. ".class" выглядит так, как будто он используется для отражения, о котором я знаком в С#, но любое понимание этого также будет приветствоваться.
Спасибо.
Ответы
Ответ 1
Обычно вы можете использовать только 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);
}
});
Ответ 2
Один за раз:
Первая конструкция называется квалифицирует это. Цель синтаксиса заключается в том, что вы находитесь во внутреннем классе (обычно это анонимный внутренний класс), и вы хотите ссылаться на this
внешнего класса, а не на this
(анонимного) внутреннего класса. "Квалифицировать это" можно использовать только в контексте, где this
будет неоднозначным. Цитата JLS "Это ошибка времени компиляции, если выражение встречается в классе или интерфейсе, который не является внутренним классом самого класса T или T".
Вторая конструкция называется class literal
- это способ ссылки на объект класса, который представляет этот тип. Его можно использовать в любом контексте.
Ответ 3
Синтаксис "Classname.this" предназначен для внутренних классов. Если вы хотите обратиться к прилагаемому экземпляру типа "Outerclass", вы сделаете это как "Outerclass.this".
NextActivity.class - это просто объект класса, который описывает класс "NextActivity".
Ответ 4
NextActivity.class
в java означает typeof(NextActivity)
в С#
Ответ 5
ClassName.this
используется для ссылки на текущий экземпляр внешнего класса из внутреннего класса.
Ответ 6
<ClassName>.this
используется во вложенных классах для обращения к текущему экземпляру охватывающего класса, поскольку ключевое слово this это относится к экземпляру класса гнезда.
открытый класс Siht { класс NestedSiht { void demoThis() { System.err.println( "this' is an instance of: " +
this.getClass().getName());
System.err.println("
Siht.this" является экземпляром: "+ . 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();
}
}
Ответ 7
Это сбивает с толку только потому, что, когда вы используете " MainActivity.this", кажется, что вы имеете в виду класс, а не объект.
В действительности, когда вы используете "this", вы всегда ссылаетесь на текущий объект,
как указано в документации по java se:
https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html
Внутри метода экземпляра или конструктора этот является ссылкой на текущий объект objec t - объект, метод которого или конструктор вызывается. Вы можете обратиться к любому члену текущего объекта из метода экземпляра или конструктора, используя это.
Это просто синтаксически своеобразно.