Java基础第十一讲:面向对象基础(五)
如果您发现本文排版有问题,可以先点击下面的链接切换至老版进行查看!!!
Java基础第十一讲:面向对象基础(五)
上面是一个高度浓缩过的例子,假设下面的子类数量远远不止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 |
} |
我们看到使用接口完美的解决了上面的问题。
最后记住接口不仅仅是为了解决多重继承问题才出现的,要不然会被人笑话的^_^。
二、接口的几个规则
- 接口名用 interface 修饰, 相对应的 类名用 class修饰
- 接口里定义的方法都是抽象方法,可以用abstract修饰,当然也可以不用它修饰
- 接口只能被实现 ( implements )
- 可以用抽象类实现接口,也就是说虽然实现了,但是没有真正写接口的任何方法,它把责任推给了抽象类的子类
- 普通类实现接口,则必须按照接口的契约,实现接口所定义的所有方法。
- 接口可以继承接口,或者说一个接口可以是另一个接口的父类
- 一个接口可以继承多个父类,也就是说一个接口之间可以多重继承。
- 分类:
- Java
更新时间:
相关文章
Java基础第九讲:面向对象基础(三)
本讲内容:继承、变量隐藏、方法重写、包、修饰符、this、super 一、继承 1、继承的概念 继承是面向对象的三大特性之一。在语义上继承的意思是照法律或遵照遗嘱接受死者的财 阅读更多…
Java基础第七讲:面向对象基础(一)
本讲内容:面向对象的概念和发展、面向对象的特征 一、面向对象(Object Oriented)编程语言的历史 1950年有个叫做荷兰德的学生作为程序员进入IBM的时候,这个世界上的程序 阅读更多…
Java基础第十二讲:面向对象基础(六)
本讲内容:内部类 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类。内部类又分为:常规内部类、局部内部类、匿名内部类和静态嵌套类四种。我们内部类的知识在Android手机开发中 阅读更多…
Java基础第十讲:面向对象基础(四)
本讲内容:抽象类、初始化块 一、抽象类 用 abstract 修饰的类定义,我们称之为抽象类,抽象类不能被实例化。 用 abstract 修饰的方法,我们称之为抽象方法,抽象方法 阅读更多…
Java基础第八讲:面向对象基础(二)
本讲内容:成员变量、方法、方法的重载、构造函数 一、用程序讲解小白的故事 小白是一条狗,它心情好的时候会恭喜人发财,它心情差的时候会对路人撒野,吓得路人落荒而逃。下面我们用面向对象的方 阅读更多…
