java第九章学习笔记:接口---灵活性的基石

java的接口主要用来描述类可以充当什么样的角色,即描述类可以具有什么样的功能,但不给出每个功能的具体实现,本章包括:概述及特性、方法及成员变量在接口中的使用、接口与抽象类、基于接口的多态、接口与回调等
9.1 概述及其特性
定义一个接口,实际上是在编写一个契约,用来描述实现其的类能够做什么,能够充当什么样的角色,而接口中并没有功能的具体实现。
eg,编写一个飞行器接口Flyer,在该接口中定义起飞方法,这样具有飞行器功能(充当飞行器角色)的所有类都可以实现该接口,并具体实现接口中的方法,不同的类可以有不同的方法实现,接口声明语法如下:
*<访问限制修饰符>[abstract]interface<接口名>
{
//方法与成员变量的声明
}*

  • 其中访问限制修饰符与类的访问限制修饰符相同,可以是public或不写,含义也完全相同。
  • 若接口定义为public的,其必须位于与其同名的java文件中
  • 方括号中的abstract代表可选的,可写可不写,但如果不写,系统在编译时也会自动加上。也就是说接口一定是抽象的
  • interface关键字说明定义的是接口,与class说明定义的,是类一样。
    一对花括号中包含的称为接口体,其中可以声明接口中的方法与成员变量。
    提示:接口隐含了abstract,所以永远不能用final来修饰接口因为abstract代表抽象,而final代表最终(很具体)相互矛盾,
    下面给出两个合法的接口声明:
public abstract interface Flyer
{

}
public interface Sailer
{

}

组成接口名的各单词首字母大写,与类相同
接口也可以像类一样进行继承扩展,eg:喷气飞行器接口可以继承飞行器接口eg:

interface Flyer{
   }
interface JetFlyer extends Flyer{
   }

这样JetFlyer接口就具有了Flyer的所有功能,并且其可以定义自身特有的成员变量与方法,在java中类不允许继承多个类,但接口可以从任意多个接口继承eg:

interface Flyer{
   }
interface Jet{
   }
interface JetFlyer extends Flyer,Jet{
   }

JetFlyer接口同时继承了Flyer,Jet,两个接口之间用逗号分隔
接口只能继承自接口,接口以外的任何类型,都不能被接口继承。
提示:C++中没有接口,只有虚类,并且C++支持多重继承,实际上C++中的虚类是扮演了java中的抽象类与接口两个角色。
9.2 成员变量在接口中的使用
9.1 语法规则
与类不同的是,接口中只能定义常量属性,并且可以不必显示使用public、static和final进行修饰,即使不用这些修饰符,编译也会为其自动加上,即接口的变量隐含了“public static final “的eg:

interface IFEx
{
    int intConst1=12;//定义成员变量intConst1,并为其分配初值12
    public static final int intConst2=66;
}
public class Sample 
{
    public static void main(String[] args)
    {
        IFEx.intConst1=IFEx.intConst1+1;//Error:The final field IFEx.intConst1 cannot be assigned
    }
}

无法为最终变量intConst1指定值 ,将上述IFEx.intConst1=IFEx.intConst1+1代码修改为System.out.println("接口IFEx中的intConst1成员的值为:"+IFEx.intConst1);运行结果如下:
![这里写图片描述](//img-blog.csdn.net/20180317113040906?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTg4NTI4Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

回顾源代码,美誉创建人和对象,是用接口名调用的intConst1,这正好也说明了intConst1是static的。
提示:接口与类不同,其中不能有静态语句块等执行代码部分,而static final成员变量又必须赋值一次,而且赋值时间不能在类加载完毕以后,只能在声明的同时给出其值。
9.2.2 接口中成员变量的作用
接口相当于一份契约,契约具有的属性应该是不变的,因此接口内只能放置常量,这样做能保证实现该接口的任何类都可以访问相同的常量,不能动态将其值随意进行修改,同时使声明的常量也会增加代码的可读性
eg:若Flyer(飞行器)通过一些特定的int值来表示不同的飞行状态1表示高空飞行。2表示中等,3表示低空飞行,当使用时,这些数字难以记忆,但若用HIGH、LOW、MIDDLE这样的常量去代替数字,将使代码具有更好的可读性,当需要发生变化时,修改常量定义即可,不需要再程序中去导出修改数字。eg:

interface Flyer
{
    //HIGH、MIDDLE、LOW分别表示高空、中等、低空飞行
    public static final int HIGH=1;
    public static final int MIDDLe=2;
    public static final int LOW=3;
}

提示:在接口声明常量的时候,为了方便一般不写出修饰符“public static final”
这些常量可以被任何实现了该接口的类直接访问,就像在该类中定义了这些常量一样。eg:

interface Flyer
{
   
    //HIGH、MIDDLE、LOW分别表示高空、中等、低空飞行
    public static final int HIGH=1;
    public static final int MIDDLe=2;
    public static final int LOW=3;
}

class AirPlane implements Flyer
{
   
    public void setFlyHeight(int height)
    {
        switch(height)
        {
        case HIGH:
            System.out.println("我现在处在高空飞行状态");
            break;
        case MIDDLe:
            System.out.println("我现在处于中等高度飞行状态");
            break;
        case LOW:
            System.out.println("正处于低空飞行状态");
            break;
        }
    }
}
public class Sample 
{
   
    public static void main(String[] args)
    {
        AirPlane air=new AirPlane();
        air.setFlyHeight(Flyer.HIGH);
    }
}

这里写图片描述
类AirPlane实现了接口Flyer,因此接口中定义的内容也相当于在类中定义了,可以直接使用,eg:switch语句中的三个case
类Sample中没有实现接口,所以要使用接口中的成员必须使用接口名调用(Flyer.HIGH)当然也可以使用实现了接口的类的类名或引用来调用,主方法中Flyer.HIGH,也可以写为“AirPlane.HIGH”或air.HIGH
若以后要修改表示飞行状态的整数值,只要修改Flyer接口中的定义即可,不需要再修改使用这些常量的代码,因为常量是按名称使用的。

9.3 方法在接口中的使用

可以将接口看做“纯粹”的抽象类,因为接口中定义的方法必须是抽象的,原因是接口只是代表

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值