一接口实现的多态

在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么

这一篇主要就要分析接口实现的多态。

实例一

Test.java源文件代码:

  1. public class Test{
  2. public static void main(String[] args){
  3. //实现接口Singer
  4. Singer s1 = new Student("Amy");
  5. s1.sing();
  6. s1.sleep();
  7. s1.study();//编译出错
  8.  
  9. //实现接口Singer
  10. Singer s2 = new Teacher("Jack");
  11. s2.sing();
  12. s2.sleep();
  13. s2.paint();//编译出错
  14. s2.eat();//编译出错
  15. s2.teach();//编译出错
  16.  
  17. //实现接口Painter
  18. Painter p1 = (Painter)s2;
  19. p1.paint();
  20. p1.eat();
  21. p1.teach();//编译出错
  22. p1.sing();//编译出错
  23. p1.sleep();//编译出错
  24. }
  25. }
  26.  
  27. //接口Singer
  28. interface Singer{
  29. //抽象方法
  30. public void sing();
  31. public void sleep();
  32. }
  33.  
  34. //接口Painter
  35. interface Painter {
  36. //抽象方法
  37. public void paint();
  38. public void eat();
  39. }
  40.  
  41. //学生类Student。继承一个Singer接口
  42. class Student implements Singer{
  43. //私有成员变量
  44. private String name;
  45.  
  46. //构造方法
  47. Student(String name){
  48. this.name = name;
  49. }
  50.  
  51. public String getName(){
  52. return name;
  53. }
  54.  
  55. //学生类独有的study()方法
  56. public void study(){
  57. System.out.println("student is studying");
  58. }
  59.  
  60. //重写接口Singer中的sing()方法
  61. public void sing(){
  62. System.out.println("student is singing");
  63. }
  64.  
  65. //重写接口Singer中的sleep()方法
  66. public void sleep(){
  67. System.out.println("student is sleeping");
  68. }
  69.  
  70. }
  71.  
  72. //教师类Teacher,继承两个接口Singer和接口Painter
  73. class Teacher implements Singer,Painter{
  74. //私有成员变量
  75. private String name;
  76.  
  77. //构造函数
  78. Teacher(String name){
  79. this.name = name;
  80. }
  81.  
  82. public String getName(){
  83. return name;
  84. }
  85.  
  86. //Teacher类独有的teach()方法
  87. public void teach(){
  88. System.out.println("teacher is teaching");
  89. }
  90.  
  91. //重写接口Singer的sing()方法
  92. public void sing(){
  93. System.out.println("teacher is singing");
  94. }
  95.  
  96. //重写接口Singer的sleep()方法
  97. public void sleep(){
  98. System.out.println("teacher is sleeping");
  99. }
  100.  
  101. //重写接口Painter的paint()方法
  102. public void paint(){
  103. System.out.println("teacher is painting");
  104. }
  105.  
  106. //重写接口Painter的eat()方法
  107. public void eat(){
  108. System.out.println("teacher is eating");
  109. }
  110. }

编译过程报错:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

从上面报错的信息能够看出:在前面的叙述面向对象多态的时候就说过,引用多态和方法多态,以及多态中的引

用类型转换,这些相同在接口中都能实现,可是有差别的是,接口不能实例化。可是能够接口的引用能够指向继承它

的子类的对象,当然调用的方法也是子类的重写接口中的抽象方法的方法。详细的对象的多态性能够參考:JavaSE

入门学习18:Java面向对象之多态

上面的编译过程报错的行数是7、13、14、15、21、22、23。这些报错的类型都是找不到符号。这是由于引用类

型不一样的原因,比方Singer接口的引用指向子类Student的对象s1。这个对象引用仅仅能包括子类Student中重写接口

Singer的两个抽象方法,不能包括其他重写Painter接口中的抽象方法以及子类Student本身独有的方法。其他的类

似。为了避免这样的编译出错,我们能够创建子类Student的对象和子类Teacher的对象。

实例二

改写Test类中的代码:

  1. public class Test{
  2. public static void main(String[] args){
  3. //创建Student类的对象,实现接口Singer
  4. Student s1 = new Student("Amy");
  5. s1.sing();
  6. s1.sleep();
  7. s1.study();
  8.  
  9. //创建Teacher类的对象,实现接口Singer和接口Painter
  10. Teacher t1 = new Teacher("Jack");
  11. t1.sing();
  12. t1.sleep();
  13. t1.paint();
  14. t1.eat();
  15. t1.teach();
  16.  
  17. }
  18. }

编译执行结果:

二接口的使用方法(实际參考)

(1)精简程序结构,免除反复定义

比方,有两个及上的的类拥有同样的方法,可是实现功能不一样,就能够定义一个接口。将这种方法提炼出来,

在须要使用该方法的类中去实现,就免除了多个类定义系统方法的麻烦。

举例:鸟类和昆虫类都具有飞行的功能,这个功能是同样的,可是其他功能是不同的,在程序实现的过程中,就

能够定义一个接口。专门描写叙述飞行。

下图是分别定义鸟类和昆虫类,其都有飞行的方法,类图为:

下图定义了接口。其类图例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

详细的代码实现:

  1. //接口FlyAnimal
  2. interface FlyAnimal{
  3. //抽象方法fly()
  4. void fly();
  5. }
  6.  
  7. //昆虫类
  8. class Insect{
  9. int legnum = 6;
  10.  
  11. void oviposition(){};
  12. }
  13.  
  14. //鸟类
  15. class Bird {
  16. int legnum = 2;
  17.  
  18. void egg(){};
  19. }
  20.  
  21. //蚂蚁类
  22. class Ant extends Insect implements FlyAnimal{
  23.  
  24. public void fly(){
  25. System.out.println("Ant can fly");
  26. }
  27.  
  28. public void oviposition(){
  29. System.out.println("Ant can spawn");
  30. }
  31. }
  32.  
  33. //鸽子类
  34. class Pigeon extends Bird implements FlyAnimal{
  35.  
  36. public void fly(){
  37. System.out.println("pigeon can fly");
  38. }
  39.  
  40. public void egg(){
  41. System.out.println("pigeon can lay eggs ");
  42. }
  43. }
  44.  
  45. public class Test{
  46. public static void main(String args[]){
  47. Ant a=new Ant();
  48. a.fly();
  49. a.oviposition();
  50. System.out.println("Ant's legs are "+ a.legnum);
  51.  
  52. System.out.println("\n");
  53. Pigeon p= new Pigeon();
  54. p.fly();
  55. p.egg();
  56. System.out.println("Pigeon's legs are "+ p.legnum);
  57. }
  58. }

编译执行结果:

(2)拓展程序功能,应对需求变化

如果一个学校接待方面的程序。招待不同身份的人的食宿问题。其相应规则例如以下:

理论上。当然能够对每一个不同身份的人各定义一个相应的类。并实现各自的方法,可是观察这写类。能够归纳出

其有一个共同的模板。即“人”的“食、宿”问题。这时候,就能够发挥接口的功能了。

详细实现代码例如以下:

  1. interface Person{
  2. void eat();
  3. void sleep();
  4. }
  5.  
  6. class Student implements Person{
  7. public void eat(){
  8. System.out.println("学生去食堂吃饭!");
  9. }
  10. public void sleep(){
  11. System.out.println("学生回寝室睡觉!");
  12. }
  13. }
  14.  
  15. class Teacher implements Person{
  16. public void eat(){
  17. System.out.println("教师去教工餐厅吃饭。");
  18. }
  19. public void sleep(){
  20. System.out.println("教师回学校公寓睡觉!");
  21. }
  22. }
  23. class Parents implements Person{
  24. public void eat(){
  25. System.out.println("家长去招待所饭馆吃饭!
  26.  
  27. ");
  28. }
  29. public void sleep(){
  30. System.out.println("家长回招待所睡觉!
  31.  
  32. ");
  33. }
  34. }
  35.  
  36. public class Test{
  37. public static void main(String[] args){
  38. Person p1 = new Student();
  39. p.eat();
  40. p.sleep();
  41.  
  42. Person p2 = new Teacher();
  43. p.eat();
  44. p.sleep();
  45.  
  46. Person p3 = new Parents();
  47. p.eat();
  48. p.sleep();
  49. }
  50. }

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

如今须要加入一些功能,即如今须要加入“外宾、上级领导”两类角色,而且以后工具须要还要加入对应的身份角

色的人进来,此时,仅仅须要依据须要加入“外宾”类、“领导”类。而主类仍然能够拿来就用。无需进行很多其它的改动。

时就能够显示出接口的作用了。

我们列表如今更新为:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

在上面的程序中加入例如以下两个类就可以:

  1. class Foreign implements Person{
  2. public void eat(){
  3. System.out.println("外宾去酒店吃饭!");
  4. }
  5. public void sleep(){
  6. System.out.println("外宾回酒店睡觉!
  7.  
  8. ");
  9. }
  10. }
  11.  
  12. class Leader implements Person{
  13. public void eat(){
  14. System.out.println("领导去宾馆吃饭!");
  15. }
  16. public void sleep(){
  17. System.out.println("领导回宾馆睡觉!");
  18. }
  19. }

我们在主方法中加入的代码为:

  1. Person p4 = new Foreign();
  2. p4.eat();
  3. p4.sleep();
  4.  
  5. Person p5 = new Leader();
  6. p5.eat();
  7. p5.sleep();

执行结果:

总结

JavaSE入门学习21:Java面向对象之接口(interface)(二)的更多相关文章

  1. JavaSE入门学习20:Java面向对象之接口(interface)(一)

    一Java接口 接口(英文:interface)是抽象方法和常量值的集合,在Java编程语言中是一个抽象类型,接口通常以interface来声 明.类是一种详细实现体.而接口定义了某一批类所须要遵守的 ...

  2. Java面向对象之接口interface 入门实例

    一.基础概念 (一)接口可以简单的理解为,是一个特殊的抽象类,该抽象类中的方法都是抽象的. 接口中的成员有两种:1.全局常量 2.抽象方法 定义接口用关键字interface,接口中的成员都用固定的修 ...

  3. JavaSE入门学习24:Java面向对象补充

    一Java中的Object类 Object类是全部Java类的父类.假设一个类没有使用extendskeyword明白标识继承另外一个类,那么这个类默认 继承Object类. public class ...

  4. JavaSE入门学习7:Java基础语法之语句(下)

    继续接着Java基础语法来:JavaSE入门学习5:Java基础语法(一)和JavaSE入门学习6:Java基础语法(二). 语句 Java经常使用的3种循环:while.do...while,for ...

  5. JavaSE入门学习6:Java基础语法之运算符和语句(上)

    继续接着上篇:JavaSE入门学习5:Java基础语法(一)来看Java的基础语法. 五运算符 运算符是一种"功能"符号,用以通知Java进行相关的运算.比方.我们须要将变量age ...

  6. Java面向对象:接口

    Java面向对象之接口 什么是接口:接口是一种规范和标准,他们可以约束类的行为,是一些方法特征的集合 语法: [修饰符] interface 接口名 extends 父接口1,夫接口2....... ...

  7. JavaSE入门学习17:Java面向对象之package(包)

           一Java包(package)        为了更好地组织类,Java提供了包机制,用于差别类名的命名空间.        包的作用:        A把功能类似或相关的类或接口组织在 ...

  8. Java面向对象程序设计--接口和内部类

    1.接口的定义: In the Java programming language, an interface is not a class but          staff[0] =       ...

  9. java面向对象_接口

    java接口 interface,是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并不是类,编写接口的方式和类很相似,但 ...

随机推荐

  1. python笔记-冒泡排序【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python/ 前言 面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信能难倒一 ...

  2. 字符串进行富文本操作后末尾emoji表情显示会乱码

    问题描述: 1.UIlabel展示的text中包含emoji表情 2.emoji表情作为最后一个字符 在满足以上条件的前提下末尾的emoji会乱码. 寻找问题过程: 因为是在单独的机型上出现的问题,所 ...

  3. 51nod 1087 1 10 100 1000【打表】

    题目来源: Ural 1209 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 1,10,100,1000...组成序列1101001000...,求 ...

  4. springboot的配置文件

    一.springboot配置文件值的注入 @ConfigurationProperties(prefix = "xxx") 实例代码: @Component @Configurat ...

  5. javascript 回调函数

    在javascript中回调函数非常重要,它们几乎无处不在.像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是有一堆关于call()和apply() ...

  6. Chrome插件开发教程收集

    教程: http://open.chrome.360.cn/extension_dev/overview.html http://www.cnblogs.com/liuxianan/p/chrome- ...

  7. 细说JavaScript对象(2):原型对象

    JavaScript 并没有类继承模型,而是使用原型对象 prototype 进行原型式继承. 尽管人们经常将此看做是 JavaScript 的一个缺点,然而事实上,原型式继承比传统的类继承模型要更加 ...

  8. ASIHTTPREQUEST framework compile error when method is called / link error

    never mind!!! duplicate: Error with iOS 5.1 when i use ASIHTTPRequest and SBJSON "I would take ...

  9. VUE的进阶 标签属性数据绑定和拼接

    在vue官网把文档扫了一遍后,就开始写网站项目了,没有设计,就百度里找了一个h5的助赢软件的网站把他copy下来,想想有点坏了,接着把内容改改吧.首先开始做一个列表展示vue实例好后,给对象添加默认数 ...

  10. 在pos:a元素不设定宽度的情况下,他的最大宽度是受父元素的宽度所限制的。

    <div style="width:80px;height:50px;position:relative;left:50px;"> <ul style=" ...