Java的接口及实例

一、定义

Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

接口定义的一般形式为:

[访问控制符]interface <接口名> {

类型标识符final 符号常量名n = 常数;

返回值类型  方法名([参数列表]);

      …

}

二、接口的特点

1、Java接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔)

2、Java接口中的方法默认都是public,abstract类型的(都可省略),没有方法体,不能被实例化

3、Java接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员方法

4、接口中没有构造方法,不能被实例化

5、一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口

6、Java接口必须通过类来实现它的抽象方法

7、当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象类

8、不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例

9、一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承.

 

三、接口的用法

1、精简程序结构,免除重复定义

比如,有两个及上的的类拥有相同的方法,但是实现功能不一样,就可以定义一个接口,将这个方法提炼出来,在需要使用该方法的类中去实现,就免除了多个类定义系统方法的麻烦。

举例:鸟类和昆虫类都具有飞行的功能,这个功能是相同的,但是其它功能是不同的,在程序实现的过程中,就可以定义一个接口,专门描述飞行。

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

 

 

         下图定义了接口,其类图如下:

 

 

实现代码如下:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. interface   Flyanimal{     
  2.    void fly();  
  3. }  
  4. class   Insect {     
  5.    int  legnum=6;  
  6. }  
  7. class  Bird {     
  8.   int  legnum=2;  
  9.   void egg(){};  
  10. }  
  11. class Ant extendsInsect implements  Flyanimal {  
  12.    public void fly(){  
  13.        System.out.println("Ant can  fly");  
  14.    }  
  15. }  
  16. classPigeon  extends Bird implements  Flyanimal {  
  17.    public void fly(){  
  18.        System.out.println("pigeon  can fly");  
  19.    }  
  20.    public void egg(){  
  21.        System.out.println("pigeon  can lay  eggs ");  
  22.    }  
  23. }  
  24. public classInterfaceDemo{  
  25.    public static void main(String args[]){  
  26.      Ant a=new Ant();  
  27.      a.fly();  
  28.      System.out.println("Ant's legs are"+ a.legnum);  
  29.      Pigeon p= new Pigeon();  
  30.     p.fly();  
  31.      p.egg();  
  32.   }  
  33. }  

程序运行结果:

Ant can  fly

Ant'slegs  are 6

pigeon  can fly

pigeon  can lay  eggs

二、拓展程序功能,应对需求变化。

         假设一个学校接待方面的程序,招待不同身份的人的食宿问题,其对应规则如下:

身份

宿

学生

食堂

宿舍

教师

教师食堂

学校公寓

学生家长

招待所

招待所

理论上,当然可以对每个不同身份的人各定义一个对应的类,并实现各自的方法,但是观察这写类,可以归纳出其有一个共同的模板,即“人”的“食、宿”问题。这时候,就可以发挥接口的功能了。实现代码如下:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. interfacePerson{  
  2.     void eat();  
  3.     void sleep();  
  4. }  
  5.    
  6. class Studentimplements Person{  
  7.     public void eat(){  
  8.        System.out.println("学生去食堂吃饭!");  
  9.     }  
  10.     public void sleep(){  
  11.        System.out.println("学生回寝室睡觉!");  
  12.     }  
  13. }  
  14.    
  15. class Teacherimplements 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.     publicvoid eat(){  
  25.        System.out.println("家长去招待所饭馆吃饭!");  
  26.     }  
  27.     public void sleep(){  
  28.        System.out.println("家长回招待所睡觉!");  
  29.     }  
  30. }  
  31.    
  32. public class PersonInterface{  
  33.          public static void main(String[] args)  
  34.          {  
  35.                    Person p=new Student();  
  36.                    p.eat();  
  37.                    p.sleep();  
  38.                    p=new Teacher();  
  39.                    p.eat();  
  40.                    p.sleep();  
  41.                    p=new Parents();  
  42.                    p.eat();  
  43.                    p.sleep();  
  44.          }  
  45. }  

程序执行结果:

学生去食堂吃饭!

学生回寝室睡觉!

教师去教工餐厅吃饭!

教师回学校公寓睡觉!

家长去招待所饭馆吃饭!

家长回招待所睡觉!

现在需要添加一些功能,即现在需要添加“外宾、上级领导”两类角色,并且以后工具需要还要添加相应的身份角色的人进来,此时,只需要根据需要添加“外宾”类、“领导”类,而主类仍然可以拿来就用,无需进行更多的修改。此时就可以显示出接口的作用了。

在上面的程序中添加如下两个类即可。

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. class Foreign implements Person{  
  2.     publicvoid eat(){  
  3.        System.out.println("外宾去酒店吃饭!");  
  4.     }  
  5.     public void sleep(){  
  6.        System.out.println("外宾回酒店睡觉!");  
  7.     }  
  8. }  
  9.    
  10. class Leader implements Person{  
  11.     publicvoid eat(){  
  12.        System.out.println("领导去宾馆吃饭!");  
  13.     }  
  14.     public void sleep(){  
  15.        System.out.println("外宾回宾馆睡觉!");  
  16.     }  
  17. }  

而主函数中用法仍然一样。

下面给出完整的代码:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. interfacePerson{  
  2.     void eat();  
  3.     void sleep();  
  4. }  
  5.    
  6. class Studentimplements Person{  
  7.     public void eat(){  
  8.        System.out.println("学生去食堂吃饭!");  
  9.     }  
  10.     public void sleep(){  
  11.        System.out.println("学生回寝室睡觉!");  
  12.     }  
  13. }  
  14.    
  15. class Teacherimplements 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.     publicvoid eat(){  
  25.        System.out.println("家长去招待所饭馆吃饭!");  
  26.     }  
  27.     public void sleep(){  
  28.        System.out.println("家长回招待所睡觉!");  
  29.     }  
  30. }  
  31. class Foreign implements Person{  
  32.     publicvoid eat(){  
  33.        System.out.println("外宾去酒店吃饭!");  
  34.     }  
  35.     public void sleep(){  
  36.        System.out.println("外宾回酒店睡觉!");  
  37.     }  
  38. }  
  39.    
  40. class Leader implements Person{  
  41.     publicvoid eat(){  
  42.        System.out.println("领导去宾馆吃饭!");  
  43.     }  
  44.     public void sleep(){  
  45.        System.out.println("领导回宾馆睡觉!");  
  46.     }  
  47. }  
  48.    
  49. public class PersonInterface{  
  50.          public static void main(String[] args)  
  51.          {  
  52.                    Person p=new Student();  
  53.                    p.eat();  
  54.                    p.sleep();  
  55.                    p=new Teacher();  
  56.                    p.eat();  
  57.                    p.sleep();  
  58.                    p=new Parents();  
  59.                    p.eat();  
  60.                    p.sleep();  
  61.                    p=new Foreign();  
  62.                    p.eat();  
  63.                    p.sleep();  
  64.                    p=new Leader();  
  65.                    p.eat();  
  66.                    p.sleep();  
  67.          }  
  68. }  

程序执行结果:

学生去食堂吃饭!

学生回寝室睡觉!

教师去教工餐厅吃饭!

教师回学校公寓睡觉!

家长去招待所饭馆吃饭!

家长回招待所睡觉!

外宾去酒店吃饭!

外宾回酒店睡觉!

领导去宾馆吃饭!

领导回宾馆睡觉!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三位数的茎叶图怎么看_贝德玛化妆品生产日期怎么看?贝德玛化妆品保质期怎么看?...

对于喜欢化妆的小伙伴来说&#xff0c;贝德玛这个名字并不陌生。因为在卸妆产品中&#xff0c;有一个爆款单品卸妆水就出自贝德玛旗下&#xff0c;当然这也是贝德玛最知名的产品。不过很多人并不知道&#xff0c;这个来自法国的化妆品品牌&#xff0c;其实属于药妆系列。所以贝…

从Loagistic 到 SVM算法

SVM&#xff08;支持向量机&#xff09;&#xff0c;一种二类分类器&#xff0c;之所以称之为向量机&#xff0c;是因为它本身就产生一个二值决策结果&#xff0c;即使一种决策“机”&#xff0c;支持向量机的泛化错误低&#xff08;具有结构风险最小&#xff09;&#xff0c;具…

数据有序_Redis实战(3)-数据结构List实战一之商品信息的有序存储

摘要电商平台的管理后端一般有两大角色的用户可以使用&#xff0c;一个是系统管理员&#xff0c;一个是平台的卖家/商家&#xff0c;对于商家而言&#xff0c;管理自个儿的商品是日常工作中再为普通不过的事情了&#xff0c;本文我们将以"有序存储并展示电商平台中商家上传…

c单链表

#include <stdio.h>#include <stdlib.h>#define T 1#define F -1typedef int Type;struct Node{Type value;struct Node *next;};int init(struct Node **head); //初始化int insert_head(struct Node *head, Type value); // 头插法int in…

和redis_Redis 缓存

使用场景#Redis 通常用作web应用的内存缓存&#xff0c;和Django&#xff0c;Ruby-on-Rails&#xff0c;Node.js以及Flask框架结合Redis在存储新的数据的过程中可以清除陈旧的数据。Redis使用Less Recently Used(LRU)策略,可以为每个健设置过期时间Redis 存储指标数据用于量化网…

invalid floating point operation什么意思_Point-MVSNet:基于多视角的点云重建网络

Point-Based Multi-View Stereo Network是一篇点云重建领域的文章&#xff0c;其工作内容为通过输入多张不同角度的图片&#xff0c;提取不同的点云特征&#xff0c;再进行融合&#xff0c;从而生成最终的点云。1.介绍Point-MVSNet的大致流程如下&#xff1a;首先生成一个粗略的…

Nonblocking I/O 与 Asynchronous I/O

2019独角兽企业重金招聘Python工程师标准>>> Nonblocking IO 使用的是 polling &#xff08;轮询&#xff09;的方法&#xff08;主动去问&#xff09;&#xff0c; 而 异步IO 使用的是信号机制&#xff08;等待系统通知&#xff09; 转载于:https://my.oschina.ne…

极大似然估计 摘自维基百科

最大似然估计[编辑] 原文地址&#xff1a; http://zh.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E4%BC%BC%E7%84%B6%E4%BC%B0%E8%AE%A1 最大似然估计&#xff0c;也称为最大概似估计&#xff0c;是一种统计方法&#xff0c;它用来求一个样本集的相关概率密度函数的参数。这个方…

unity改变图片像素大小_类动森像素画反向转换 (xBR)

起因前阵子沉迷动森&#xff0c;DIY 样式的画风真的超萌(&#xff9f;д&#xff9f;)&#xff89;&#xff0c;恰巧在推上看到有个小姐姐在讨论这个像素画转换的算法&#xff0c;就想在 Unity 里整整。最后实现的镜头特效效果如下图。像素缩放算法常见的像素缩放算法对比图如下…

99 网络编程_传统网络工程师如何利用python实现公司内网IP地址信息查询?

网工圈网络工程师阿龙圈内最早的公益公众号,本号已认证&#xff01;学网络关注我一个就够了(关注近5w)关注听说99%的网工都来这里充电吖关注我&#xff0c;一个老HCIE(编号3558)带你轻松玩网络技术&#xff01; 交个朋友&#xff0c;一起和一个技术狂热者相互交流&#xff0c;共…

[原创]windows server 2012 AD架构试验系列 – 12 配置操作主机

[原创]windows server 2012 AD架构试验系列 – 12 配置操作主机ActiveDirectory支持域中所有域控制器之间的目录数据存储的多主机复制&#xff0c;因此域中的所有域控制器实质上都是对等的。ActiveDirectory支持域中所有域控制器之间的目录数据存储的多主机复制&#xff0c;因此…

笔记本换内存条

步骤一 拆除护盖 笔记本内存插槽上都有护盖保护&#xff0c;首先第一步就是先将护盖拆掉。大多数笔记本的护盖上都有标识&#xff0c;有的是内凹的内存图形&#xff0c;而且从护盖的大小也能看出来&#xff0c;一般内存护盖的大小&#xff0c;就比内存条大一点。当然有不少笔记…

angularJS 指令实践

AngularJS 指令&#xff08;Directives&#xff09;实践指南(1) 2014-03-12 10:22 陈鑫伟 编译 伯乐在线我要评论(0)字号&#xff1a;T|T一个指令用来引入新的HTML语法。指令是DOM元素上的标记&#xff0c;使元素拥有特定的行为。举例来说&#xff0c;静态的HTML不知道如何来创…

数据结构四双向链表

双向链表也叫双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c;从双向链表中的任意一个结点开始&#xff0c;都可以很方便地访问它的前驱结点和后继结点。而之前的单链表为单向链表&#xf…

Linux服务器的初步配置流程

开发网站的时候&#xff0c;常常需要自己配置Linux服务器。 本文记录配置Linux服务器的初步流程&#xff0c;也就是系统安装完成后&#xff0c;下一步要做的事情。这主要是我自己的总结和备忘&#xff0c;如果有遗漏&#xff0c;欢迎大家补充。 下面的操作针对Debian/Ubuntu系统…

不要学习代码,要学会思考(转)

英文原文&#xff1a;Dont learn to code, learn to think 译/赖信涛 这是一个人人都在学习编程的时代&#xff1a;Code.org请了比尔盖茨&#xff0c;马克扎克伯格和克里斯波什等这些名人&#xff0c;来告诉你&#xff0c;每个人都可以编程&#xff1b;CoderDojo’s在各个国家悄…

Hadoop的改进实验(中文分词词频统计及英文词频统计)(4/4)

声明&#xff1a; 1&#xff09;本文由我bitpeach原创撰写&#xff0c;转载时请注明出处&#xff0c;侵权必究。 2&#xff09;本小实验工作环境为Windows系统下的百度云&#xff08;联网&#xff09;&#xff0c;和Ubuntu系统的hadoop1-2-1&#xff08;自己提前配好&#xff0…

旋转函数_【视频课】:一次函数拓展应用(图象的平移、旋转、轴对称及5种解题方法)...

请点击上方“出彩数学”可以免费订阅哦停课不停学★ 特别关注&#xff1a;今日头条、西瓜视频——初三中考解题方法与技巧、初一、初二的同步讲解视频&#xff0c;正在陆续上传&#xff0c;请关注今天头条或西瓜视频(下载APP&#xff0c;搜索“出彩数学”&#xff0c;关注即可…

c语言中,关于延迟函数的理解

对于延迟&#xff0c;有些c基础的人都能够做到用for或while来实现 例如&#xff1a; #include <stdio.h>int main() {int i, j, k;for (i 1; i < 1000; i){for (j 1; j < 1000; j){for (k 1; k < 1000; k){}}}printf("hello\n");return 0; }1234…

火山去水印链接_在线批量去水印下载快手图集视频、抖音、火山等平台方法技巧!...

不管是做自媒体还是做电商或是工作素材采集&#xff0c;都离不开视频&#xff0c;视频比文字更好展示出产品、细节内容&#xff0c;就好比我们经常看的抖音、快手、火山、皮皮虾之类的短视频里面就有很多优秀的素材&#xff0c;相信有采集过的朋友都会遇到平台水印这个问题吧&a…