创建接口实例 class java

Creating instances of interface class java

谁能给我解释一下创建接口 class 变量的含义是什么?

具体来说,以下代码是什么意思:

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

我一直认为接口(在Java中)只是方法声明的集合,其功能由实现接口的classes定义。例如,如果我有一个接口:

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

那么 class 将使用此接口作为:

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);

我真的不明白这在概念上到底是什么意思。有人可以解释或指出我可以自学的资源吗?

谢谢!!

您看到的是多态性,它是使接口有用的核心概念之一。

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

这里发生的是 factory.createFactorObject(zz.CONST);正在返回一个对象。我不知道它到底是什么类型的对象,但如果这段代码编译并运行成功,那么该对象至少必须是实现了 InterfaceA 的 class。因此,它具有 InterfaceA 中定义的所有方法的实现。

所以你可以强制转换为InterfaceA,并假定你可以使用InterfaceA中定义的方法。底层 JVM 负责准确了解这些方法是如何实现的(通过 class 实例化对象)以及调用这些方法时要执行的操作。

Interfaces 的实例在 java 中是不允许的。因此可以使用工厂模式来生成实现 Interface 的 class 实例。例如,createFactoryObject 内部可能看起来像这样:

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

return new toCreate();

,或者简单地使用提供的原型来生成新的实例。 命名嵌套 class 只是为了让事情更清楚,也可以是匿名 class,或任何其他 class。基本上这只是一种完全封装class成员的方法,除了接口指定的成员。

有趣的是,您可以多次实现同一接口,这意味着同一接口有许多行为,数据访问对象就是一个很好的例子

我的界面

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
    }
}

那叫polymorphism