器不需要对其进行动态绑定。例如,
的类族之间可以进行类型转换。
得到我真正想要的,“不安全”的编程方แ式已逐渐成为ฦ编程代价高昂的主因之一。编译器就可以为final方法调用生成更有效的代;这,感谢prenticehall的paulpet;
。但不能ม把它转换成@sincນe
问题,并且只用一行代码就可以做更多的事。
中ณ,动态绑定是缺省行为,你不需要添加额外的关键字来实现多态poly摸rphism。然
super。“橡树”可转型为ฦ“树”,反之亦然,并最终取得胜利的
multipleinterfaທces
interfaທ9fight{
voidfight;
}
interfa99im{
void9im;
}
interfa9fly{
voidfly;
}
9๗charaທcter{
publicvoidfight{}
}
9๗dsa9๗character
implements9๗fly{
publicvoid9im{}
publicvoidfly{}
}
pubຘli9๗ture{
publi9๗fightx{xfight;๙}
publi9๗9imx{9๗im;๙}
publi9flyx{xfly;}
publi9charaທcterx{xfight;}
publi9stringargs{
heroh=ne9hero;
th;treatitasa9fight
uh;๙treatitasa99im
vh;treatitasa9๗fly
9h;treaທtitasaທna9๗chaທraທcນter
}
}:~
你可以看到,hero组合了具体类aທ9fight、9fly。这个具体类必须ี是先行,
当你要通过这种方式将,后面
跟着的才是接口。否则编译器会报错。9char,
注意,而且,在hero
中ณ并没有fight的定义。接口的规则是:你可以从接口中继承就像稍后你会看到เ的那
样,但是你得到的只是另一个接口。如果你想创建该新类型的对象,就必须有一个ฐ了
其全部定义แ的类。即使hero没有显式地fight的定义,其定义也随a9chaທracນter
而存在,因此它是被自动的,这使得创建hero对象成为了可能。
在adventure类中,你可以看到有四个方法把上述各种接口和具体类作为参数。当hero对
象被创น建时,它可以被传递给这些方法中ณ的任何一个,这意味着它依次被向上转型为每一个
接口。由于javaທ中这种接口设计的方แ式,使得这项ำ工作并不需要程序员一方付出任何特别
的努力。
一定要记住,前面的例子所展示的就是使用接口的核心原因:为了能够向上转型为不止一个
的基类型。然而,使用接口的第二个原因却是与使用抽象基类相同:防止客户端程序员创建
该类的对象,并确保这仅仅是建立一个接口。这就带来了一个问题:我们应该使用接口还是
抽象类?接口为你带来了使用抽象类的好处,并且还带来了使用接口的好处,所以如果你要
创建不带任何方แ法定义和成员变量的基类,那么你应该选择接口而不是抽象类。事实上,如
果你知道某事物应该成为ฦ一个ฐ基类,那么你的第一选择应该是使它成为ฦ一个ฐ接口,只有在强