先贴一段代码(<JAVA编程思想>(中文版)第179页):
interface CanFight {
void fight();
}
interface CanSwim {
void swim();
}
interface CanFly {
void fly();
}
interface CanClimb{
void climb();
}
class ActionCharacter {
public void fight() {}
}
class Hero extends ActionCharacter
implements CanFight, CanSwim, CanFly, CanClimb {
public void swim() {}
public void fly() {}
public void climb() {}
}
public class Adventure {
//代理
public static void t(CanFight x) { x.fight(); }
public static void u(CanSwim x) { x.swim(); }
public static void v(CanFly x) { x.fly(); }
public static void w(ActionCharacter x) { x.fight(); }
public static void c(CanClimb x){ x.climb(); }
public static void main(String[] args) {
Hero h = new Hero();
t(h); // Treat it as a CanFight
u(h); // Treat it as a CanSwim
v(h); // Treat it as a CanFly
w(h); // Treat it as an ActionCharacter
c(h);
}
}
Hero类组合了基类ActionCharacter和接口CanFlight,CanSwim和CanFly,当通过这种方式将一个具体类和多个接口组合到一起时,具体类必须在前,接口在后(否则会报错).
CanFight接口与ActionCharacter的fight()方法特征签名一样,这样,Hero中就没有必要再提供fight()的定义了,因为这个定义会在编译的初期随着调用ActionCharacter基类而定义好.
这也提示了子类遵循某个接口或继承某个基类的不同之处.用通俗的话可以这样说:
接口是告诉这个类,我有的东西,你必须得有.(即接口有的方法定义,在子类定义时必须都重新定义一遍)
基类是告诉这个子类,我有的东西,你可以拿去用.(即基类有的方法定义,子类可以直接继承下去而不必重新定义)
接口的继承又会是另一种情形,它类似于类的继承.
nterface Sleep
{
void haveSleep();
}
interface Rest extends Sleep//接口的继承也是用extends关键字
{
//void haveSleep();//这些都是没 有必要的.
void haveRest();
}
interface Nap extends Sleep
{
//void haveSleep();
void haveNap();
}
interface nod extends Rest, Nap
{
//void haveSleep();
//void haveRest();
//void haveNap();
void haveNod();
}
分享到:
- 2008-11-02 21:59
- 浏览 1568
- 评论(2)
- 论坛回复 / 浏览 (2 / 3200)
- 查看更多
相关推荐
7.5.1 Java的“多重继承” 7.5.2 通过继承扩展接口 7.5.3 常数分组 7.5.4 初始化接口中的字段 7.6 内部类 7.6.1 内部类和上溯造型 7.6.2 方法和作用域中的内部类 7.6.3 链接到外部类 7.6.4 static内部类 7.6.5 引用...
Java中只允许单一继承,不允许多重继承,即每个类只能有一个父类。 《Java程序设计案例教程》教学课件05深入Java面向对象全文共47页,当前为第5页。 5.2 继承 Java中通过关键字extends实现子类对父类的继承。定义...
说到底,所有的组件都继承了java.awt.Component类,而handleEvent()就在java.awt.Component类中。 然而,这种模型也存在缺点: - 事件只能由产生这个事件的组件或包含这个组件的容器处理。这个限制违反了面向对象...
21.12 多重继承与virtual基类 21.13 结束语 小结 术语 自测练习 自测练习答案 练习 附录A 运算符的优先级与结台律 附录B ASCII字符集 附录C 数值系统 附录D 有关C++的Internet与Web资源 参考文献 【媒体评论】
21.12 多重继承与virtual基类 21.13 结束语 小结 术语 自测练习 自测练习答案 练习 附录A 运算符的优先级与结台律 附录B ASCII字符集 附录C 数值系统 附录D 有关C++的Internet与Web资源 参考文献 【媒体评论】
现在思考当你要从其他命名空间的类中访问 HelloWorld 类。 复制内容到剪贴板 代码: using System; namespace AnotherNameSpace { class AnotherClass { public void Func() { Console.WriteLine ("Hello World...
9.4.5 滥用多重继承 254 9.4.6 忽视C++高级特性的复杂度 255 9.4.7 学习C++ 256 9.5 动态内存分配的优化 257 9.5.1 另一种优化策略:多次分配,一次释放 266 9.5.2 垃圾回收 268 9.5.3 再论动态内存分配 269 9.6 ...
9.4.5 滥用多重继承 254 9.4.6 忽视C++高级特性的复杂度 255 9.4.7 学习C++ 256 9.5 动态内存分配的优化 257 9.5.1 另一种优化策略:多次分配,一次释放 266 9.5.2 垃圾回收 268 9.5.3 再论动态内存分配 269 9.6 ...
DbHelperV2 - Teddy的通用数据库访问组件设计和思考 也论该不该在项目中使用存储过程代替SQL语句 如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典...
1.9 Java、Internet与万维网--------------------------------------------7 1.10 其它高级语言------------------------------------------------------8 1.11 结构化编程-----------------------------------...