Thinking in Java 3 Edition v(h); Treat it as a canFly w(h); Treat it as an Actioncharacter 可以看到,Hero合并了具体的 Action character类,以及 Can Fight, Can swin和 Can Fly接口。当你用这种方式合并实体类 ( concrete class)和接口的时候,必须将实体类放在前面,然后才是接 口。(否则编译器就会报错。) 注意 Action character类的 fight()方法。它的特征与 interface Can Fight的 fight()方法完全相同,但是Hero没有提供fght()的 定义。 interface的规则是这样的,你可以继承它(马上就会说到),但 是继承下来的还是 interface。如果你想创建一个新类型的对象,那么 这个类型就必须是类,而且还得提供所有定义。尽管Hero没有明确的提 供 fight()的定义,但是 Action character提供了,所以Hero能自 动获得这个方法,并且能创建对象了 Adventure类有四个拿接口和实体类作参数的方法。创建出来的Hero 对象可以被传给其中任何一个方法,也就是说它被依次上传给了各个 interface。这个过程不需要程序员编写特别的代码,这一切要归功于接 口在Java中的设计。 上述程序告诉我们接口的真正目的:能够上传到多个基本类型(base type)。然而,使用接口的第二个理由,实际上是和“把 abstract类用 做基类”完全相同的:就是要禁止客户程序员去创建这个类的对象,并且 重申“这只是一个接口”。这就带来了一个问题:到底是用 interface,还是用 abstract类? interface既给了你 abstract类 的好处,又给了你 interface的好处,因此只要基类的设计里面可以不 包括方法和成员变量的定义,你就应该优先使用 interface。实际上, 如果你知道这样东西可能会是基类的话,你就应该优先考虑把它做成 interface,只有在不得不定义方法或成员变量的情况下,你才能把它改 成 abstract类,或者根据需要改成实体类。 合并接口时的名字冲突 实现多个接口的时候可能会遇到一些小问题。在上述例程中, Can Fight 和 Action character都有一个一摸一样的 void fight()方法。这里 没有问题,因为它们使用的是同一个方法。但是如果不是呢?下面就是 个例子: //: c08: Interfacecollision. java interface Il void f(i interface I2 int f(int i)i] 第7页共47页 www.wgqqh.com/shhgs/tij.html email:shhgs@sohu.comThinking in Java 3 rd Edition ✄ 7 ☎ ✆ 47 ☎ www.wgqqh.com/shhgs/tij.html email:shhgs@sohu.com v(h); // Treat it as a CanFly w(h); // Treat it as an ActionCharacter } } ///:~ ÝE<gH ero °,º»( Action Character Eà Can F igh tCan Swim Can Fl y ¡ µ´°ñ» (concrete cl ass)(M
ñ»kF¶Z (Ä9áºÅÆ) ¹ Action Character ( figh t( )µA()Ç in terface Can F igh t ( figh t( )µc> H ero m figh t( )( O4in terface (È9 ¦(¡ÝEö8A(ÉJº$g ) ö8Q( in terfaceÄÅ¡|123×Âh(¥!YZ ×h
à³DmO4ÊË H ero m$Ì( figh t( )(O4 Action Character ,DE H ero ;ý Í ×µ³;12¥!, Adven tu re mÎ×Ïñ»1c(µ12!Q( H ero ¥!ÝEvA¬§*t3×µ[$AvШJA¬,Ñ× in terface ×^âXî%â%&á«)¨(K 3Ò%ÓF) F Java *(+, Jâ%#(zj«(L;ÔJAgV×B h(base type)àç(×¢7ñ¢JÍP abstract TBÏc>(L%Õ+Ö×â%&12 ×(¥!³ ØÍ ó3×Ï ¬Q,3×¹Lgh in terface abstract Ê in terface ²¬,¡ abstract (Ùü¬,¡ in terface (Ùæòó%B(+,˶ÝEX kÚµ&Û(O4¡vwV/ç in terfaceñ¢J ÄÅ¡NO ¦ÜÝÝ;ºB(¡vwV/ÞPAT in terfaceómFXXO4µ3&Û(´¡Z;PAð abstract 3;mî%ðñ» ñíV×(MÝ;º±g3Ìß¹FJâ*Can F igh t Action Character Æm3×3à3¦( void figh t( )µ Ë m¹æAç(3×µÄÅXáÊ ¶3 ×L //: c08:InterfaceCollision.java interface I1 { void f(); } interface I2 { int f(int i); }