Можем ли мы создать экземпляр интерфейса на Java?

Можно ли создать экземпляр интерфейса на Java?

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

interface Test {
    public void wish();
}

class Main {
    public static void main(String[] args) {
        Test t = new Test() {
            public void wish() {
                System.out.println("output: hello how r u");
            }
        };
        t.wish();
    }
}
cmd> javac Main.java
cmd> java Main
output: hello how r u

Здесь все правильно?


person Ninja    schedule 03.01.2011    source источник


Ответы (7)


Да, ваш пример верен. Анонимные классы могут реализовывать интерфейсы, и это единственный раз, когда я могу представить, что вы увидите класс, реализующий интерфейс без ключевого слова Implements. Посмотрите еще один пример кода прямо здесь:

interface ProgrammerInterview {
    public void read();
}

class Website {
    ProgrammerInterview p = new ProgrammerInterview() {
        public void read() {
            System.out.println("interface ProgrammerInterview class implementer");
        }
    };
}

Это прекрасно работает. Было взято с этой страницы:

http://www.programmerinterview.com/index.php/java-questions/anonymous-class-interface/

person Magnus    schedule 01.05.2013
comment
Эта компиляция без ошибок? Насколько мне известно, интерфейсы не могут быть созданы, но в вашем ответе это делается через строку ProgrammerInterview p = new ProgrammerInterview () { - person Kasun Siyambalapitiya; 24.07.2016
comment
в приведенном выше примере мы не создали экземпляр объекта ProgrammerInterview, но мы сделали то, что использовали ProgrammerInterview для создания ссылки, а затем создали объект анонимного класса. Этот анонимный класс реализовал ProgrammerInterview и создал объект анонимного класса за один раз. - person Sargam Modak; 21.08.2016
comment
Но разве ты не звонишь new ProgrammerInterview () {...? Итак, технически вы создаете экземпляр интерфейса. Я все еще немного запутался в том, что здесь происходит. - person ; 24.01.2017
comment
Если бы этот анонимный класс ProgrammerInterview был создан внутри main() метода, тогда мы могли бы получить доступ к его методу read(), вызвав p.read(). - person Ram; 05.06.2018

Вы никогда не сможете создать интерфейс в java. Однако вы можете ссылаться на объект, реализующий интерфейс, по типу интерфейса. Например,

public interface A
{
}
public class B implements A
{
}

public static void main(String[] args)
{
    A test = new B();
    //A test = new A(); // wont compile
}

Выше вы создали анонимный класс, реализующий интерфейс. Вы создаете анонимный объект, а не объект типа interface Test.

person Chad La Guardia    schedule 03.01.2011
comment
Анонимные классы не имеют имен .... анонимные - person jjnguy; 03.01.2011
comment
Его спрашивают, верен ли его пример, и это так. Не уверен, что вы это осознали ... - person rsenna; 03.01.2011
comment
Пример работает ... но не так, как он думает. Важно понимать, что на самом деле делает код. Я бы не назвал это правильным, если бы код был чем-то другим, чем он думает. - person Chad La Guardia; 03.01.2011
comment
@JJnguy, у всех классов есть имена. В случае анонимного класса он генерируется компилятором. Вы можете выполнить getClass (). GetName () в анонимном классе и получить его имя. Вы можете использовать это имя для доступа к нему через отражение. - person Peter Lawrey; 03.01.2011
comment
@Peter, ну вы не даете анонимным классам имена. Но я полагаю, они действительно получили имена. - person jjnguy; 03.01.2011
comment
@claguardia: Нет, даже после вашего последнего редактирования это неверно - анонимный класс не назван Test! Он создает объект типа анонимный, который реализует интерфейс Test. Я знаю, что у вас хорошие намерения, но если вы хотите кого-то исправить, пожалуйста, делайте это правильно! - person rsenna; 03.01.2011
comment
Хммм, да, я думаю, Питер прав. Если заглянуть дальше, локальные классы имеют немного другой синтаксис в Java. То, что я сказал изначально, правильно. Если вы посмотрите на лингвистику Java, они определяют синтаксис для автономного класса, подобного этому new class-name ( [ argument-list ] ) { class-body } . Ключевое слово есть имя класса. - person Chad La Guardia; 03.01.2011
comment
@rsenna Думаю, ты прав. По-видимому, для этого существует синтаксис для автономных классов, определенный следующим образом: new interface-name () { class-body }. Однако это просто создание класса, реализующего интерфейс, а не фактическое создание экземпляра интерфейса. Хорошая находка, и я обновил свой ответ, чтобы отразить это. Мне было бы любопытно, как достичь этого с помощью отражения. Интересно, как это называет компилятор. - person Chad La Guardia; 03.01.2011
comment
@claguardia: это будет называться как-то вроде Main $ 1. Компилятор Sun обычно использует $, за которым следуют некоторые цифры для всевозможных синтетических конструкций - я не думаю, что это требуется какой-либо спецификацией, BICBW. Что касается того, есть ли у класса имя - с точки зрения правил языка Java, его нет (т.е. нет имени, которое вы можете использовать в качестве имени класса в источнике, которое будет относиться к анонимному классу), но в с точки зрения правил виртуальной машины Java, это так. Это немного дырявая абстракция. - person Tom Anderson; 03.01.2011
comment
Спасибо, парни. Теперь я думаю, что Идея ясна. то есть мы не можем создать экземпляр интерфейса, но здесь я создал анонимный класс, реализующий, что интерфейс затем назначает этот объект класса ссылке на интерфейс и вызывает метод через эту ссылку, я сейчас здесь? - person Ninja; 05.01.2011
comment
Но в строке Test t = new Test () {}, что здесь означает new Test ()? Это имя создаваемого innerClass также сохраняется как Test или используется только для упоминания того, что класс реализует интерфейс? - person Ninja; 05.01.2011
comment
Если вы посмотрите на один из приведенных выше комментариев, вы увидите, что синтаксис требует interface-name, чтобы компилятор знал, что автономный объект реализует интерфейс. Это просто часть грамматики языка. - person Chad La Guardia; 05.01.2011
comment
код будет компилироваться с использованием интерфейса таким образом A test = new A (), а также вы можете вызвать метод своего реализованного класса. - person Hariprasath; 17.04.2014
comment
@ChadLaGuardia отличное объяснение! прямо в точку! - person Thor; 08.01.2016
comment
Есть ли какой-то смысл иметь интерфейс без какого-либо объявления метода внутри? (за исключением цели показать, что интерфейс, внутри которого ничего нет, не может быть создан) - person Marian Paździoch; 06.04.2016

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

person Mooh    schedule 03.01.2011
comment
Это как раз то, что мне нужно. - person Karthick K; 01.03.2021

Короткий ответ ... да. Вы можете использовать анонимный класс при инициализации переменной. Взгляните на этот вопрос: Анонимные или именованные внутренние классы? - лучшие практики?

person Liviu T.    schedule 03.01.2011
comment
Я бы сказал нет ... Поскольку анонимный реализует интерфейс ... Но у вас нет ключевого слова реализации - person ; 02.05.2016

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

person Ketan G    schedule 25.04.2015

Да, это правильно. вы можете сделать это с помощью внутреннего класса.

person zinan.yumak    schedule 03.01.2011
comment
Это кажется наиболее правильным из ответов, хотя объяснений нет. Для программистов Android Google предоставляет пример класса создания экземпляра внутреннего интерфейса здесь. - person SMBiggs; 10.08.2016

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

person Veerendra Kakumanu    schedule 23.12.2014