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;具…

Scala.js:将Scala编译为JavaScript的编译器

Scala.js是一款将Scala代码编译为JavaScript代码的编译器&#xff0c;该编译器支持全部Scala语言特性。借助于Scala.js&#xff0c;开发者能够使用Scala开发从前端到后端的Web应用&#xff0c;而且Scala.js还带来了在服务器和客户端之间复用代码的可能性。Scala.js值得关注的特…

array

array_shift(使得第一个参数和后面的参数分开&#xff0c;先进先出) vsprintf格式化sql语句 $r substr($sql,0,6)从0个开始截取6位。这种写法在php5.4之前是不支持的 strcasecmp(a,b);如果ab就返回0&#xff0c;如果第一个大于第二个就返回1&#xff0c;否则返回-1 array_push…

c程序

题目&#xff1a;一个数如果恰好等于它的因子之和&#xff0c;这个数就称为“完数”。例如61&#xff0b;2&#xff0b;3.编程找出1000以内的所有完数。1. 程序分析&#xff1a;请参照程序<--上页程序14.2.程序源代码&#xff1a; #include "stdio.h" #include &q…

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

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

关于asp.net利用mono部署到Linux上的一些说明

linuxdot.net社区群&#xff1a;102732979&#xff08;如果你认为你已经在.NET跨平台方面有足够的经验&#xff0c;请参加这个群&#xff1a;103810355&#xff09;。 其中有各种大神&#xff0c;嘿嘿&#xff0c;如果你有问题可以来咨询&#xff0c;完全无偿的免费的。 mono的…

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 存储指标数据用于量化网…

你好,C++(34)有一只叫做多利的羊 6.2.4 拷贝构造函数

6.2.4 拷贝构造函数 在C世界中&#xff0c;除了需要使用构造函数直接创建一个新的对象之外&#xff0c;有时还需要根据已经存在的某个对象创建它的一个副本&#xff0c;就像那只叫做多利的羊一样&#xff0c;我们希望根据一只羊创建出来另外一只一模一样的羊。例如&#xff1a…

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

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

在ubuntu 12.04上安装tomcat 7.40

因为源上的版本问题&#xff0c;所以没有使用源上的自动安装包&#xff0c;老规矩&#xff0c;Tomcat 7.0.40 Core下载地址&#xff1a;http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.40/bin /apache-tomcat-7.0.40.tar.gz 放入当前登录用户根目录: ~ 1、依旧是解压 t…

Nonblocking I/O 与 Asynchronous I/O

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

锐浪报表数据源access_kylin+SuperSet实现实时大数据报表的快速开发

最近我的团队将报表计算引擎从阿里的OLAP分析中间价迁移到了kylin上&#xff0c;解决了非常多的问题&#xff0c;将一些我们的解决方案分享出来&#xff0c;希望对读者或者在用kylin的人有所帮助。一、 之前现状和问题之前我们系统的报表都是基于阿里云的相关组件开发的&#x…

结构体定义的三钟方式

#include <stdio.h>#include <string.h>structStudent{ intid; charname[ 20 ]; intage;} s3; //定义方式3&#xff0c;不常用的一种方式intmain(){ structStudent s1; //定义方式1s1.id 0 ; strcpy (s1.name, "Zhang" ); s1.age 20 ; stru…

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

最大似然估计[编辑] 原文地址&#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 里整整。最后实现的镜头特效效果如下图。像素缩放算法常见的像素缩放算法对比图如下…

【记忆化搜索】bzoj3208 花神的秒题计划Ⅰ

暴力 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 701 const int dx[]{0,0,-1,1},dy[]{-1,1,0,0}; int n,mem[N][N],a[N][N],m; bool cant[N][N]; int f(int x,int y) {if(mem[x][y]) return mem[x][y];mem[x][…

c语言程序2

题目&#xff1a;有一分数序列&#xff1a;2/1&#xff0c;3/2&#xff0c;5/3&#xff0c;8/5&#xff0c;13/8&#xff0c;21/13...求出这个数列的前20项之和。1.程序分析&#xff1a;请抓住分子与分母的变化规律。2.程序源代码&#xff1a; #include "stdio.h" …

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

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