方法。但更重要的一点或许是:这样做可以有效地“关闭”动态绑定,或者是想告诉编译
器不需要对其进行动态绑定。这样,编译器就可以为final方法调用生成更有效的代码。然
importuceeckelsimpletest;๙
publicclasstooltest{
第四章初始化与清除
随着计算机革命的展,“不安全”的编程方แ式已๐逐渐成为编程代价高昂的主因之一。
同一段落,置于生成的html中。
@sincນe
使用virtual关键字来实现的。在这些语言中,方แ法在缺省情况下不是动态绑定的。而在jaທva
中,动态绑定是缺省行为,你不需要添加额外的关键字来实现多态poly摸rphism。
编写出健壮的、高效的、灵活的程序是jaທva程序员们面临ภ的重大挑战。
《java编程思想》就是一本能ม够让jaທva程序员轻松面对这一挑战,并最终取得胜利的
multipleinterfaces
interfaທ9fight{
voidfight;๙
}
interfa99im{
void9im;๙
}
interfaທ9fly{
voidfly;
}
9chaທracter{
pubຘlicvoidfight{}
}
9๗dsa9character
implements9fly{
publicvoid9im{}
publicvoidfly{}
}
pubຘli9ture{
pubຘli9๗fightx{xfight;}
publi99๗imx{9im;๙}
publi9๗flyx{xfly;}
publi9characterx{xfight;}
publi9stringaທrgs{
heroh=ne9hero;
th;treatitasa9๗fight
uh;treaທtitasa9๗9๗im
vh;treatitaທsa9fly
9๗h;treaທtitasana9cນharacter
}
}:~
你可以看到,hero组合了具体类a9๗fight、9fly。
当你要通过这种方式将一个具体类和多个接口组合到เ一起时,这个ฐ具体类必须是先行,后面
跟着的才是接口。否则编译器会报错。
注意,9characນter类中的fight方法的签名是一样的,而且,在hero
中并没有fight的定义。接口的规则是:你可以从接口中继承就像稍后你会看到的那ว
样,但是你得到的只是另一个接口。如果你想创建该新类型的对象,就必须有一个了
其全部ຖ定义的类。即使hero没有显式地fight的定义,其定义也随a9cນharacນter
而存在,因此它是被自动的,这使得创建hero对象成为了可能。
在adventure类中,你可以看到有四个方法把上述各种接口和具体类作为ฦ参数。当hero对
象被创建时,它可以被传递给这些方แ法中ณ的任何一个ฐ,这意味着它依次被向上转型为每一个ฐ
接口。由于java中这种接口设计的方แ式,使得这项工作并不需要程序员一方แ付出任何特别
的努力。
一定要记住,前面的例子所展示的就是使用接口的核心原因:为了能够向上转型为不止一个ฐ
的基类型。然而,使用接口的第二个原因却是与使用抽象基类相同:防止客户端程序员创建
该类的对象,并确保这仅仅是建立一个ฐ接口。这就带来了一个问题:我们应该使用接口还是
抽象类?接口为ฦ你带来了使用抽象类的好处,并且还带来了使用接口的好处,所以如果你要
创建不带任何方法定义和成员变量的基类,那么เ你应该选择接口而不是抽象类。事实上,如
果你知道某事物应该成为ฦ一个ฐ基类,那么你的第一选择应该是使它成为ฦ一个接口,只有在强