Можем ли мы создать объект интерфейса? - PullRequest
31 голосов
/ 22 октября 2010
interface TestA {
    String toString();
}

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

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

A.test
B. null
C. Выдается исключение во время выполнения.
D. Компиляция завершается неудачно из-за ошибки в строке 1.
E. Компиляция завершается неудачей из-за ошибки в строке 4.
F. Компиляция не удалась из-за ошибки в строке 5.

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

Ответы [ 5 ]

87 голосов
/ 22 октября 2010

Здесь вы видите анонимный внутренний класс :

С учетом следующего интерфейса:

interface Inter {
    public String getString();
}

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

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

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

5 голосов
/ 22 октября 2010

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

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

1 голос
/ 15 февраля 2011

Попробуйте тоже ... Имя анонимного класса сгенерировано!

Inter instance = new Inter() {
    public String getString(){ return "HI"+this.getClass(); }
};
1 голос
/ 03 января 2011

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

0 голосов
/ 21 марта 2014

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

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

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

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

...