【Java学习笔记之二十二】解析接口在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、精简程序结构,免除重复定义

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

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

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

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

实现代码如下:

 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

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

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


身份



宿


学生


食堂


宿舍


教师


教师食堂


学校公寓


学生家长


招待所


招待所

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

 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 }

程序执行结果:

学生去食堂吃饭!

学生回寝室睡觉!

教师去教工餐厅吃饭!

教师回学校公寓睡觉!

家长去招待所饭馆吃饭!

家长回招待所睡觉!

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

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

 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 }

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

下面给出完整的代码:

 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 }

程序执行结果:

学生去食堂吃饭!

学生回寝室睡觉!

教师去教工餐厅吃饭!

教师回学校公寓睡觉!

家长去招待所饭馆吃饭!

家长回招待所睡觉!

外宾去酒店吃饭!

外宾回酒店睡觉!

领导去宾馆吃饭!

领导回宾馆睡觉!

举例二:

用来计算每一种交通工具运行1000公里所需的时间,已知每种交通工具的参数都是3个整数A、B、C的表达式。现有两种工具:

Car 和Plane,其中Car 的速度运算公式为:A*B/C

Plane 的速度运算公式为:A+B+C。

如果增加第3种交通工具的时候,比如火车(Train)不必修改以前的任何程序,只需要编写新的交通工具的程序。

 1 import java.lang.*;
 2  interface Common {
 3       double runTimer(doublea, double b, double c);
 4            String getName(); //获取交通工具的名称
 5 }
 6
 7  class Plane implementsCommon  {
 8       public doublerunTimer(double a, double b, double c)  {
 9             return (a+ b + c);
10       }
11            public String getName(){
12                    return"Plane";
13            }
14 }
15  class Car implements Common {
16       public doublerunTimer(double a, double b, double c) {
17             return ( a*b/c );
18       }
19             public String getName(){
20                    return"Car";
21            }
22 }
23
24 public class ComputeTime {
25
26       public static void main(Stringargs[])  {
27             double A=3;
28             double B=5;
29             double C=6;
30             double v,t;
31                             Commond=new Car();
32            v=d.runTimer(A,B,C);
33             t=1000/v;
34            System.out.println(d.getName()+"的平均速度: "+v+" km/h");
35            System.out.println(d.getName()+"的运行时间:"+t+" 小时");
36                             d=newPlane();
37                             v=d.runTimer(10,30,40);
38                             t=1000/v;
39            System.out.println(d.getName()+"的平均速度: "+v+" km/h");
40             System.out.println(d.getName()+"的运行时间:"+t+" 小时");
41       }
42 }

程序运行结果;

Car的平均速度: 2.5 km/h

Car的运行时间:400.0 小时

Plane的平均速度: 80.0 km/h

Plane的运行时间:12.5 小时

时间: 2024-08-01 00:48:48

【Java学习笔记之二十二】解析接口在Java继承中的用法及实例分析的相关文章

Dynamic CRM 2013学习笔记(三十二)自定义审批流3 - 节点及实体配置

上次介绍了<Dynamic CRM 2013学习笔记(十九)自定义审批流1 - 效果演示> 以及如何配置自定义审批流的按钮:<Dynamic CRM 2013学习笔记(二十一)自定义审批流2 - 配置按钮>,这次接着介绍如何配置审批流的节点及节点关系.     一. 模板头: 二.流程节点:        一共有三种节点:开始节点,中间节点,结束节点: 1.  开始节点: 2. 中间节点: .3.  结束节点:       三.流程节点关系:   四.实体配置 1.添加二个字段:

Dynamic CRM 2013学习笔记(四十二)流程5 - 实时/同步工作流(Workflow)用法图解

实时工作流跟插件一样,也是用事件执行管道来执行,能在pre,post或核心操作中执行.跟插件一样,不能在创建之前和删除之后执行.如果执行过程中有异常发生,会取消并回滚整个操作.实时工作流里所有的活动和子流程都是一个事务,不像异步工作流里,子流程是单独的一个事务.不能使用等待或并行等待条件步骤.如果执行成功,就看不到执行的log.实时工作流能被转到异步工作流,还能再转回实时工作流.下面详细介绍如何创建一个实时工作流.   一.创建实时工作流 1. 打开 Setting > Process, 点击N

JavaScript DOM编程艺术-学习笔记(第十二章)

第十二章 1.本章是综合前面章节的所有东西的,一个综合实例 2.流程:①项目简介:a.获取原始资料(包括文本.图片.音视频等) b.站点结构(文件目录结构) c.页面(文件)结构 ②设计(切图) ③css -  base.css用于引入使用的css文件 color.css  - 用于设置样式 layout.css - 用于设置布局 Typography.css - 用于设置版式 3.题外话:①在实际开发中,即使是一个空白项目也往往不会从一无所有做起,而借助的平台一般会提供目录结构,所以需要把自己

黑马程序员----java学习笔记之数组、二维数组,附相关面试题

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 一:数组(掌握) (1)数组:存储同一种数据类型的多个元素的容器. (2)特点:每一个元素都有编号,从0开始,最大编号是长度-1. 编号的专业叫法:索引 (3)定义格式 A:数据类型[] 数组名; B:数据类型 数组名[]; 推荐是用A方

JAVASE学习笔记:第十二章 集合

因数组一旦创建长度就不能改变 集合(collection),将多个相同性质的元素汇聚成一个整体   所在java.util包 集合框架(collection framework) 一.List是一个有序的.可重复的子接口,ArrayList是实现list的一个子类 在集合当中只能存放引用数据类型,不能存放基本数据类型 ArrayList list=new ArrayList(); list.add(对象); list.add(位置,对象); list.get(2);//获取指定位置的元素,返回的

鸟哥的Linux私房菜_基础版_学习笔记8:第十二章 正规表示法与文件格式化处理

11.2 基础正规表示法 11.2.1 语系对正规表示法的影响 由於不同语系的编码数据并不相同,所以就会造成数据撷取结果的差异了. 举例来说,在英文大小写的编码顺序中,zh_TW.big5 及 C 这两种语系的输出结果分别如下: LANG=C     时:0 1 2 3 4 ... A B C D ... Z a b c d ...z LANG=zh_TW 时:0 1 2 3 4 ... a A b B c C d D ... z Z 特殊符号 代表意义 [:alnum:] 代表英文大小写字节及

Linux学习笔记(三十二)iptables filter表案例、 iptables nat表应用

一.iptables filter表案例 需求:将80.20.21端口放行,对22端口指定特定的ip才放行 以下为操作方法: vim  /usr/local/sbin/iptables.sh    //加入如下内容 #! /bin/bashipt="/usr/sbin/iptables"   //定义一个变量,写iptables的绝对路径 $ipt -F                //清空规则 $ipt -P INPUT DROP        //添加默认的INPUT规则 $ip

OpenCV学习笔记(六十二)——《OpenCV Computer Version with Python》阅读摘要

现在python火啊,每次OpenCV自带的ml模块都让我直呼坑爹,索性准备用python来做OpenCV后期的机器学习算法的处理.于是赶紧拿起这本书读读. 适合OpenCV和python都有一定基础的....由于都比较熟悉这两个东西,我阅读之前比较关心的只有几个问题,具体的应用实例没有仔细看. 1.如何在python中安装opencv 2.OpenCV的Mat数据结构能否方便的转换成numpy的array结构 3.OpenCV的GUI模块在python里好用么 4.二者还能擦出什么我想不到的火

USB学习笔记连载(十二):USB描述符

USB设备是端口,接口,配置的集合,USB协议是以各种USB描述符来表征USB设备的功能.计算机通过这些描述符来获得USB设备的功能. USB描述符包括: USB标准设备描述符,USB集线器描述符.HID描述符,这里主要讲解USB描述符. USB标准设备描述符包括:设备描述符,端点描述符,接口描述符,配置描述符,设备限定描述符,其他描述符.这些所有的描述符都在 官方固件中的 dscr.a51 文件中,注意!!!!!   1.设备描述符 一共18个字节,14个字段.在官方给的固件程序中的描述如下图