2010-10-22 2 views
26
interface TestA { 
    String toString(); 
} 

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

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

А. Испытание
Б. нуль
С. Исключение генерируется во время выполнения.
D. Компиляция не удается из-за ошибки в строке 1.
E. Компиляция не удается из-за ошибки в строке 4.
F. Компиляция не удается из-за ошибки в строке 5.

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

+11

Похоже, вопрос теста. Кстати, почему бы вам просто не попробовать? – Kel

+7

ответ, который вы получите, запустив его. – Bozho

+4

@Kel: Может быть, он хочет объяснить, почему это работает? –

ответ

5

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

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

76

То, что вы видите здесь является anonymous inner class:

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

interface Inter { 
    public String getString(); 
} 

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

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

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

+2

Я искал его. Это очень короткий и простой ответ. +1 к его простоте. – amod

+0

Интересно, почему это не принято в качестве ответа. –

+1

простой и идеальный ответ, спасибо большое – smoothumut

1

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

1

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

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

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

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

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

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

Смежные вопросы