`
jaywee
  • 浏览: 40606 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JAVA多重继承思考

    博客分类:
  • JAVA
阅读更多

先贴一段代码(<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();
}
 
分享到:
评论
2 楼 jaywee 2008-11-02  
风花雪月饼 写道

建议不要再拿接口来忽悠出什么多重继承了。
原本初学的时候就是这些地方搞不明白,被这一忽悠更不明白了。

内容错误:
CanFight接口与ActionCharacter的fight()方法特征签名一样,这样,Hero中就没有必要再提供fight()的定义了

Java代码 class&nbsp;ActionCharacter&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;act()&nbsp;{}&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;class ActionCharacter { 
   public void act() {} 
}


ActionCharacter并未提供fight()方法。所以你的说明是错误的。
将act()改为fight才符合你说的。
Java代码 class&nbsp;ActionCharacter&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;fight()&nbsp;{}&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;class ActionCharacter { 
   public void fight() {} 
}


发布前请先验证。

如果你是对书上抄的,难怪有人说需要有一定经验才能看懂。
中文描述也太不清楚了。

呵呵.不好意思..我其实 是看thinking in java看到这里想到了这些,所以找个地方把想到的东西备份一下..以后好回过头来看.属于很私人的行为.没有想过要拿出来教导别人的..呵
说实话,我对接口这章也不太懂...
另外,你看东西好仔细,那是我后来为了测试改的代码,现在已经改回来了..谢谢了...
1 楼 风花雪月饼 2008-11-02  
建议不要再拿接口来忽悠出什么多重继承了。
原本初学的时候就是这些地方搞不明白,被这一忽悠更不明白了。

内容错误:
CanFight接口与ActionCharacter的fight()方法特征签名一样,这样,Hero中就没有必要再提供fight()的定义了

class ActionCharacter {  
   public void act() {}  
} 


ActionCharacter并未提供fight()方法。所以你的说明是错误的。
将act()改为fight才符合你说的。
class ActionCharacter {  
   public void fight() {}  
} 


发布前请先验证。

如果你是对书上抄的,难怪有人说需要有一定经验才能看懂。
中文描述也太不清楚了。

相关推荐

    java 编程入门思考

    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程序设计案例教程》教学课件05深入Java面向对象.pptx

    Java中只允许单一继承,不允许多重继承,即每个类只能有一个父类。 《Java程序设计案例教程》教学课件05深入Java面向对象全文共47页,当前为第5页。 5.2 继承 Java中通过关键字extends实现子类对父类的继承。定义...

    java认证所有课程

    说到底,所有的组件都继承了java.awt.Component类,而handleEvent()就在java.awt.Component类中。 然而,这种模型也存在缺点: - 事件只能由产生这个事件的组件或包含这个组件的容器处理。这个限制违反了面向对象...

    C++大学教程,一本适合初学者的入门教材(part2)

    21.12 多重继承与virtual基类 21.13 结束语 小结 术语 自测练习 自测练习答案 练习 附录A 运算符的优先级与结台律 附录B ASCII字符集 附录C 数值系统 附录D 有关C++的Internet与Web资源 参考文献 【媒体评论】

    C++大学教程,一本适合初学者的入门教材(part1)

    21.12 多重继承与virtual基类 21.13 结束语 小结 术语 自测练习 自测练习答案 练习 附录A 运算符的优先级与结台律 附录B ASCII字符集 附录C 数值系统 附录D 有关C++的Internet与Web资源 参考文献 【媒体评论】

    在一小时内学会 C#(txt版本)

    现在思考当你要从其他命名空间的类中访问 HelloWorld 类。 复制内容到剪贴板 代码: using System; namespace AnotherNameSpace { class AnotherClass { public void Func() { Console.WriteLine ("Hello World...

    我的编程感悟(中文PDF)(共37M二分卷)分卷二

    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 ...

    我的编程感悟(中文PDF)(共37M二分卷)分卷一

    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 ...

    asp.net知识库

    DbHelperV2 - Teddy的通用数据库访问组件设计和思考 也论该不该在项目中使用存储过程代替SQL语句 如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典...

    C++大学教程

    1.9 Java、Internet与万维网--------------------------------------------7 1.10 其它高级语言------------------------------------------------------8 1.11 结构化编程-----------------------------------...

Global site tag (gtag.js) - Google Analytics