链接地址:http://www.cnblogs.com/vamei/archive/2013/03/31/2982240.html

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

实施接口中,我们利用interface语法,将interface从类定义中独立出来,构成一个主体。interface为类提供了接口规范。

继承中,我们为了提高程序的可复用性,引入的继承机制。当时的继承是基于类的。interface接口同样可以继承,以拓展原interface。

接口继承

接口继承(inheritance)与类继承很类似,就是以被继承的interface为基础,增添新增的接口方法原型。比如,我们以Cup作为原interface:

interface Cup {
void addWater(int w);
void drinkWater(int w);
}

我们在继承Cup的基础上,定义一个新的有刻度的杯子的接口,MetricCup

接口如下:

interface MetricCup extends Cup
{
int WaterContent();
}

我们增添了一个新的方法原型WaterContent(),这个方法返回一个整数(水量)。

interface的多重继承

在Java类的继承中,一个衍生类只能有一个基类。也就是说,一个类不能同时继承多于一个的类。在Java中,interface可以同时继承多于一个interface,这叫做多重继承(multiple inheritance)。

比如我们有下面一个Player接口:

interface Player
{
void play();
}

我们新增一个MusicCup的接口。它既有Cup接口,又有Player接口,并增加一个display()方法原型。

interface MusicCup extends Cup, Player
{
void display();
}

(如何使用interface,见实施接口)

抽象类

在生活中,我们会有一些很抽象的概念。这些抽象的概念往往是许多类的集合,比如:

  • 粮食 (可以是玉米、小麦、大米)
  • 图形 (可以是三角形、圆形、正方形)

再比如,我们之前举出了例子:

  • 人类 (可以是男人、女人)

在组织这样的关系时,我们可以使用继承,比如:

根据我们的常识:

  • "Food类的对象"的说法是抽象的。这样一个对象应该是属于Corn, Rice, Wheat子类中的一个。
  • Food类有eat()方法 (食物可以吃)。然而,这样的一个动作是抽象的。粮食的具体吃法是不同的。比如Corn需要剥皮吃,Wheat要磨成面粉吃。我们需要在每个类中覆盖Food类的eat()方法。

抽象与具体

Java中提供了抽象类(abstract class)的语法,用于说明类及其方法的抽象性。比如:

abstract class Food {
public abstract void eat();
public void happyFood();
{
System.out.println("Good! Eat Me!");
}
}

类中的方法可以声明为abstract,比如上面的eat()。这时,我们不需要具体定义方法,只需要提供该方法的原型。这与接口类似。当我们在比如Corn类中继承该类时,需要提供eat()方法的具体定义。

类中的另一个方法happyFood()并不是

当一个类中出现abstract方法时,这个类的声明必须加上abstract关键字,否则Java将报错。一个abstract类不能用于创建对象。

抽象类的继承

我们可以像继承类那样继承一个抽象类。我们必须用完整的方法定义,来覆盖抽象类中的抽象方法,否则,衍生类依然是一个抽象类。

抽象类的定义中可以有数据成员。数据成员的继承与正常类的继承相同。

总结

interface继承,多重继承

abstract method, abstract类

欢迎继续阅读“Java快速教程”系列文章

最新文章

  1. iOS实现UICollectionViewDataSource与Controller的分离
  2. 【积累篇:他山之石,把玉攻】解决XP 系统 .Net Framework 4安装时出现严重错误 (0x80070643)
  3. 让JavaScript回归函数式编程的本质
  4. <!DOCTYPE html PUBLIC 导致js代码不可用
  5. CSS3外轮廓属性
  6. 【JAVA】【leetcode】【使用堆栈实现后向计算】
  7. Centos 反向代理创建资料
  8. DOM操作基础
  9. 最牛X的GCC 内联汇编
  10. SQL TUNNING
  11. show processlist
  12. Ubuntu 14.10 下NodeJS Cannot find module 'npmlog'
  13. 【LeetCode】104 - Maximum Depth of Binary Tree
  14. ThinkPHP实现跨模块调用操作方法概述
  15. Linux常用解压文件
  16. javascript的insertBefore、insertAfter和appendChild简单介绍
  17. 分页加载的Fragment
  18. java Runtime类
  19. php 关于经纬度距离计算方法 成功版
  20. DedeCMS实现自定义表单提交后发送指定QQ邮箱法

热门文章

  1. javascript 简易文本编辑器
  2. PHP学习笔记11-表单
  3. 转: seajs知识点与cmd规范
  4. web.py入门
  5. server配置学习 ---- 关闭防火墙
  6. mysql select简单用法
  7. EBS 数据库预克隆日志
  8. 静态化 - 伪静态技术(PHP正则表达式实现)
  9. oracle常见问题
  10. Python获取并修改hosts