Создание экземпляров класса интерфейса java

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

В частности, что означает следующий код:

InterfaceA x = (InterfaceA) factory.createFactoryObject(zz.CONST);

Я всегда думал, что интерфейс (в Java) — это просто набор объявлений методов, функциональность которых определяется классами, реализующими интерфейс. Например, если у меня есть интерфейс:

public interface IMoveBehavior(){
    public void move_Along_X();
    public void move_Along_Y();
    public void move_Along_Z();
}

тогда класс будет использовать этот интерфейс как:

public class ABC() implements IMoveBehavior{
    public void move_Along_X(){
        //do whatever
    }
    public void move_Along_Y(){
        //do whatever
    }
    public void move_Along_Z(){
        //do whatever
    }   
}

Итак, возвращаясь к

InterfaceA x = (InterfaceA) factory.createFactoryObject(zz.CONST);

Я действительно не понимаю, что именно это означает концептуально. Может ли кто-нибудь объяснить или указать мне ресурс, где я могу обучаться?

Спасибо!!


person JavaFan    schedule 21.08.2015    source источник
comment
x — это переменная, указывающая на объект любого типа, который реализует интерфейс InterfaceA.   -  person BoDidely    schedule 21.08.2015
comment
Программирование интерфейса   -  person GriffeyDog    schedule 21.08.2015
comment
Это называется приведением типов.   -  person Luiggi Mendoza    schedule 21.08.2015
comment
@Luiggi, да, я понимаю, что приведение типов происходит с (InterfaceA) factory.createFactoryObject(zz.CONST), это не мой вопрос. Мой вопрос: почему мы приводим тип к интерфейсу...   -  person JavaFan    schedule 21.08.2015
comment
@GriffeyDog, отличная ссылка!!   -  person JavaFan    schedule 21.08.2015
comment
Ваш вопрос сводится к приведению типов, независимо от того, используете ли вы интерфейс, абстрактный класс или неабстрактный класс. Приведение типов работает так же. Если вы хотите/должны знать, почему программировать, ориентированную на интерфейсы, а не направлять известные классы, например. объявите свои переменные как List, а не ArrayList или LinkedList, тогда ссылка, опубликованная @GriffeyDog, будет дубликатом.   -  person Luiggi Mendoza    schedule 21.08.2015


Ответы (3)


Вы видите случай полиморфизма, который является одной из основных концепций, делающих интерфейсы полезными.

InterfaceA x = (InterfaceA) factory.createFactoryObject(zz.CONST);

Здесь происходит то, что factory.createFactorObject(zz.CONST); возвращает объект. Я точно не знаю, что это за объект, но если этот код успешно компилируется и работает, то объект должен как минимум принадлежать к классу, реализующему InterfaceA. В результате он имеет реализации для всех методов, определенных в InterfaceA.

Таким образом, вы можете выполнить приведение к InterfaceA и считать само собой разумеющимся, что вы можете использовать методы, определенные в InterfaceA. Базовая JVM отвечает за точное знание того, как эти методы были реализованы (классом, из которого создан экземпляр объекта) и что делать, если эти методы вызываются.

person Xirema    schedule 21.08.2015
comment
Спасибо, @Xirema за объяснение. так что просто чтобы убедиться, что я понимаю: как только вы создадите объект, реализующий этот интерфейс, а затем вернетесь к тому же интерфейсу, то, по сути, это будет интерфейс, но только с полностью определенными методами, извлеченными из объекта, верно? - person JavaFan; 21.08.2015
comment
@JavaFan, пожалуйста, сосредоточьтесь на приведении типов. Вот в чем дело. - person Luiggi Mendoza; 21.08.2015

Экземпляры Interfaces не разрешены в java. Таким образом, можно использовать шаблон factory для создания экземпляра класса, реализующего Interface. Например, createFactoryObject внутри может выглядеть так:

...
class toCreate implements InterfaceA{
    ...//all methods implemented
}

return new toCreate();

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

person Paul    schedule 21.08.2015

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

Мой интерфейс

Interface Dao {
    Entity create(Entity e);

    Entity find(long id);

    Entity merge(Entity e);

    void delete(Entity e);
}

И 2 разные реализации

Class JpaDao implements Dao {
    Entity create(Entity e) {
        //use EntityManager
    }

    Entity find(long id) {
        //use EntityManager
    }

    Entity merge(Entity e) {
        //use EntityManager
    }

    void delete(Entity e) {
        //use EntityManager
    }
}

Class JdbcDao implements Dao {
    Entity create(Entity e) {
        //use preparedStatement
    }

    Entity find(long id) {
        //use preparedStatement
    }

    Entity merge(Entity e) {
        //use preparedStatement
    }

    void delete(Entity e) {
        //use preparedStatement
    }
}

Это называется полиморфизмом.

person Jib'z    schedule 21.08.2015