Можем ли мы создать объект интерфейса?
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