本讲内容:接口

一、为什么要有接口

我们已经知道Java中只支持单继承,或者说不允许多重继承的出现,又可以说一个类只能有一个父类。为了提供类似多重继承的功能,Java提供了接口的功能,下面我们共同学习一下接口。

我们还是拿一个例子来引入接口的概念吧。

image

上面是一个高度浓缩过的例子,假设下面的子类数量远远不止4种,也假设方法数来那个也不止2个。

首先我们定义了一个动物的类,它有吃和叫的方法,接下来我们想增加一个玩耍的方法和亲近主人的方法,如果把这两个方法定义在动物类里,看起来确实不 合理,因为老虎对象也会继承到亲近主人的方法,如果该方法默认实现是用舌头舔主人的脖子的话,就会产生老虎舔你脖子讨好你的场景,似乎有点太销魂了,这种 设计方式副作用太大。

如果把这两个方法定义在猫狗等需要的类里,这时候又会产生同样的内容重复写多次的情形,更不可接受。

哎这时候你可能在想如果Java里可以多重继承多好啊,我再定义一个宠物类,在里面定义玩耍和亲近主人的方法,然后让猫狗这些类也去继承宠物类问题 不就解决了?可惜Java不允许这么干…… (关于为什么Java中不允许多重继承,可以参见Java番外篇致命方块的诞生)。

好在Java里提供了接口的功能,你可以把宠物和动物都定义成接口,让猫狗去实现这两个接口,也可以把动物定义成一个普通类或者抽象类,让猫狗去继承动物,再让猫狗去实现宠物接口。

下面我们用代码表达出来。在这里我用中文标识符是为了提高教学效果,请在实际编程中彻底断绝用中文标识符的想法,别因为猎奇的原因今后开始用中文,还说是我教你的^_^

 

01 class Animal {
02
03     public void 吃() {
04         System.out.println("吃");
05     }
06
07     public void 叫() {
08         System.out.println("叫");
09     }
10
11 }
12
13 interface Pet {
14     public void 玩耍();
15
16     public void 讨好主人();
17 }
18
19 class Lion extends Animal {
20 }
21
22 class Tiger extends Animal {
23 }
24
25 class Cat extends Animal implements Pet{
26
27     @Override
28     public void 玩耍() {
29         System.out.println("玩耍");
30     }
31
32     @Override
33     public void 讨好主人() {
34         System.out.println("舔你脖子(什么嗜好……)");
35     }
36 }
37
38 class Dog extends Animal implements Pet{
39
40     @Override
41     public void 玩耍() {
42         System.out.println("玩耍");
43     }
44
45     @Override
46     public void 讨好主人() {
47         System.out.println("舔你脖子(狗也这样……)");
48     }
49 }
50
51 public class XiaoBai{
52     public static void main(String[] args){
53         Dog xiaobai = new Dog();
54         xiaobai.叫();
55         xiaobai.吃();
56         xiaobai.玩耍();
57         xiaobai.讨好主人();
58     }
59 }

编译并运行程序,查看结果:

image

我们看到使用接口完美的解决了上面的问题。

最后记住接口不仅仅是为了解决多重继承问题才出现的,要不然会被人笑话的^_^。

二、接口的几个规则

image

  1. 接口名用 interface 修饰, 相对应的 类名用 class修饰
  2. 接口里定义的方法都是抽象方法,可以用abstract修饰,当然也可以不用它修饰
  3. 接口只能被实现 ( implements )
  4. 可以用抽象类实现接口,也就是说虽然实现了,但是没有真正写接口的任何方法,它把责任推给了抽象类的子类
  5. 普通类实现接口,则必须按照接口的契约,实现接口所定义的所有方法。
  6. 接口可以继承接口,或者说一个接口可以是另一个接口的父类
  7. 一个接口可以继承多个父类,也就是说一个接口之间可以多重继承。

 

以上规则,有点超浓缩了,请同学们慢慢体会。

最后总结一下,当你实现接口时就表明你同意遵守定义在接口中的契约,也意味着你肯定实现了接口定义的所有方法。那么任何了解该接口方法形式的人,都 确信他们能够调用你所实现的类,去执行接口中的方法。 这时候我们说接口是一个契约,是一个like a 的关系(继承是 is a 关系)。

很多时候我们说不要滥用继承,要用接口,不要用继承,也是基于这样的思考。

好了本讲就到这里,Take your time and enjoy it 。

分享至上:分享源头

随机文章

在facebook上创建页面并给予唯一url
在facebook上创建页面并给予唯一url

Java基础第七讲:面向对象基础(一)
Java基础第七讲:面向对象基础(一)

Google Now能设置你的手机了
Google Now能设置你的手机了

IOS用户转投android吧
IOS用户转投android吧

起凡被黑?咋做任务的空间几天都打不开啊
起凡被黑?咋做任务的空间几天都打不开啊

自2010起百度在移动方面上涨1000%
自2010起百度在移动方面上涨1000%

相关文章

Java基础第七讲:面向对象基础(一)
Java基础第七讲:面向对象基础(一)

Java基础第九讲:面向对象基础(三)
Java基础第九讲:面向对象基础(三)

Java基础第十讲:面向对象基础(四)
Java基础第十讲:面向对象基础(四)

Java基础第八讲:面向对象基础(二)
Java基础第八讲:面向对象基础(二)

Java基础第十二讲:面向对象基础(六)
Java基础第十二讲:面向对象基础(六)

自2010起百度在移动方面上涨1000%
自2010起百度在移动方面上涨1000%

内容分享:道招
本文链接:Java基础第十一讲:面向对象基础(五)
道招声明:除特别标注或作者不详外,本站所有文章均为原创,转载请注明。欢迎共同关注互联网!