Можете ли вы или не можете создать экземпляр интерфейса?

#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) и создает его экземпляр, передавая вложенный экземпляр (плюс любые локальные переменные, на которые ссылаются ваши методы) в новый экземпляр с помощью параметров конструктора.

Итак, это обычный старый класс, который создается, а не интерфейс, только этот класс был написан не вами, а беззвучно компилятором при использовании такой языковой конструкции.