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

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


person shirsendu shome    schedule 22.10.2010    source источник


Ответы (6)


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

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

interface Inter {
    public String getString();
}

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

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

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

person jjnguy    schedule 22.10.2010
comment
Я искал это. Это очень короткий и простой ответ. +1 к его простоте. - person amod; 10.07.2012
comment
@SheikhAman, лол, я сомневаюсь, что этот ОП когда-либо выберет правильный ответ - person Ungeheuer; 28.10.2016
comment
Так правда ли, что на самом деле был вызван System.out.println(innerObject.getString());, что не привело к какой-либо ошибке? - person Koushik Shom Choudhury; 06.08.2018

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

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

person Stefan Kendall    schedule 22.10.2010

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

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

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

person Marcos Vasconcelos    schedule 03.01.2011

Мы можем создать объект анонимного класса. , реализующий интерфейс:

Анонимные классы позволяют сделать ваш код более кратким. Они позволяют вам объявить и создать экземпляр класса одновременно. Они похожи на локальные классы, за исключением того, что у них нет имени. Используйте их, если вам нужно использовать локальный класс только один раз.

Если у вас есть интерфейс, в котором объявлен один метод toString, вы можете сначала создать класс, реализующий этот интерфейс, а затем создать объект этого класса:

interface TestA {
    String toString();
}

class TestB implements TestA {
    @Override
    public String toString() {
        return "test";
    }
}

public class Test {
    public static void main(String[] args) {
        System.out.println(new TestB());
    }
}

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

interface TestA {
    String toString();
}

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

В обоих случаях выводится "test".

person Community    schedule 31.08.2020

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

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

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

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

person Abhijit Chakra    schedule 21.03.2014