使用接口和实现来实例化类

时间:2010-01-14 13:41:21

标签: java

尝试澄清何时基于接口或抽象类创建新变量,并在特定实现时新建变量。

示例:

IBlah blah = new BlahImpl();

你怎么读出来的?

是吗:

IBlah类型的引用变量blah是用类BlahImpl实现的吗?

所以引用变量绑定到IBlah,因此只有IBlah的方法/实例和静态变量,但是使用BlahImpl类实现那些属性/变量?

试图纠正我的术语。

3 个答案:

答案 0 :(得分:8)

接口和抽象类可以永远实例化。您在示例中可以执行的操作是实例化具体类,但将结果对象分配给接口。

考虑以下类层次结构:

    IBlah
      ^
      |
AbstractBlah
      ^
      |
   BlahImpl

如果IBlah是一个接口而AbstractBlah是一个抽象类而BlahImpl是一个具体的类,则以下代码行都是无效的:

IBlah blah1 = new IBlah();
IBlah blah2 = new AbstractBlah();
AbstractBlah blah3 = new AbstractBlah();

以下代码行都有效:

IBlah blah1 = new BlahImpl();
AbstractBlah blah3 = new BlahImpl();

所以你可以实例化具体的类,但你赋予它的变量可以是具体类的任何超类型(由类实现的父类或接口)。

您可以通过接口或抽象类变量来引用和使用具体类。事实上,这实际上是鼓励的,因为对抽象类(或接口)的编程使您的代码更加灵活。

可以从就地的接口或抽象类创建具体类。所以,如果我们有这样的界面:

interface IBlah {
    void doBlah();
}

该接口可以一举实现和实例化:

IBlah blah = new IBlah() {
    public void doBlah() {
        System.out.println("Doing Blah");
    }
};

答案 1 :(得分:1)

“实例化BlahImpl对象,并将其作为接口blah的实现分配给变量IBlah。”我们也可以将它称为演员,因为通过像这样分配隐式演员。

编辑:你的第一个答案听起来也合理,第二个答案听起来不合理。

答案 2 :(得分:0)

也许这更清楚:

创建BlahImpl的新实例,然后将其投放到IBlah并将其分配给blah