#java #android #instantiation
#java #Android #создание экземпляра
Вопрос:
Не уверен, что понимаю.. Меня учили, что вы не можете создать экземпляр интерфейса, но когда я использую интерфейс LocationListener, я пишу:
locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {}
Это работает так, как должно, но разве это не создание экземпляра интерфейса? Я не совсем уверен, что понимаю…
Комментарии:
1. Это создание экземпляра анонимного класса, который реализует интерфейс: см. docs.oracle.com/javase/tutorial/java/javaOO /. … Попробуйте распечатать
locationListener.getClass()
: вы увидите, что это неLocationListener
так, но, скорее всего, что-то вродеYourClassName$1
.2. А, хорошо, спасибо, что прояснили это.
Ответ №1:
Уточнение комментария Энди:
Если вы напишете что-то вроде
final int myLocal = ...;
locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
doSomething(myLocal);
}
};
это сокращение для
class YourClassName$1 implements LocationListener {
private final YourClass enclosingInstance;
private final int myLocalCopy;
YourClassName$1(YourClass enclosingInstance, int myLocal) {
this.enclosingInstance = enclosingInstance;
this.myLocalCopy = myLocal;
}
@Override
public void onLocationChanged(Location location) {
doSomething(myLocalCopy);
}
}
и затем
final int myLocal = ...;
locationListener = new YourClassName$1(this, myLocal);
(Имена, которые я использовал, вероятно, не будут совпадать с именами, созданными вашей компиляцией)
Сокращение автоматически компилируется в новый класс (с именем, недопустимым для обычного исходного кода Java) и создает его экземпляр, передавая вложенный экземпляр (плюс любые локальные переменные, на которые ссылаются ваши методы) в новый экземпляр с помощью параметров конструктора.
Итак, это обычный старый класс, который создается, а не интерфейс, только этот класс был написан не вами, а беззвучно компилятором при использовании такой языковой конструкции.