尝试澄清何时基于接口或抽象类创建新变量,并在特定实现时新建变量。
示例:
IBlah blah = new BlahImpl();
你怎么读出来的?
是吗:
IBlah类型的引用变量blah是用类BlahImpl实现的吗?
所以引用变量绑定到IBlah,因此只有IBlah的方法/实例和静态变量,但是使用BlahImpl类实现那些属性/变量?
试图纠正我的术语。
答案 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
。