Можем ли мы создать объект интерфейса?

interface TestA {
    String toString();
}

public class Test {
    public static void main(String[] args) {
        System.out.println(new TestA() {
            public String toString() {
                return "test";
            }
        });
    }
}

Каков результат?

а. тест
B. null
C. Исключение выбрасывается во время выполнения.
D. Ошибка компиляции из-за ошибки в строке 1.
E. Компиляция не выполняется из-за ошибки в строке 4.
F. Ошибка компиляции из-за ошибки в строке 5.

Каков ответ на этот вопрос и почему? У меня есть еще один вопрос по этому вопросу. В строке 4 мы создаем объект A. Возможно ли создать объект интерфейса?

Ответ 1

Что вы видите здесь, это анонимный внутренний класс:

Учитывая следующий интерфейс:

interface Inter {
    public String getString();
}

Вы можете создать что-то вроде экземпляра его так:

Inter instance = new Inter() {
    @Override
    public String getString() { 
      return "HI"; 
    } 
  };

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

Ответ 2

test должен быть выход. Это пример анонимного внутреннего класса.

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

Ответ 3

Трюк не совсем относится к анонимному внутреннему классу, этот тест печати вызывает переопределение метода toString, а в System.out.println объекта, который он неявно, вызывает метод toString.

Ответ 4

Попробуйте это тоже... Создается имя анонимного класса!

Inter instance = new Inter() {
    public String getString(){ return "HI"+this.getClass(); }
};

Ответ 5

Я не знаю значения этого вопроса. Если это вопрос интервью, я могу сказать, что все в порядке. Но в реальном времени это не правильный подход для реализации наследования. Итак, чтобы ответить на вопрос, здесь вы делаете анонимный внутренний класс.

Здесь вы создаете класс и , реализуя наследование, написав

System.out.println(new TestA() {
    public String toString() {
        return "test";
    }
}); 

и, конечно, результат будет test