JAVA接口
本章目标
-
接口的语法
-
接口的应用
-
jdk1.8 接口新特性
-
接口和抽象类的区别
-
匿名内部类
本章内容
一、接口语法:
-
概念,接口是一种规则和标准,而这些规则和标准需要实现类来实现,侧重于can do
-
接口的实现:使用implements关键字
-
接口的定义:
-
接口中也可以存放全局常量,默认为:public static final
-
一个类可以实现多个接口
-
一个类既可以实现多个接口也可以同时继承一个类,但是继承需要写到实现的前面,先继承后实现
-
一个接口可以继承多个接口(接口和接口之间的关系)
-
接口语法总结
-
接口中定义的方法,默认为:public abstract
-
接口中没有构造器,代码块
-
接口不能被实例化,主要作用就是被实现类实现,接口的主要是体现为标准
-
一个类可以实现多个接口,测试的时候,一个接口类型的变量指向实现类对象后,接口类型的变量只能调用出来本接口中定义过的方法,实现类独有的方法不能调用
-
一个类既可以实现多个接口也可以同时继承一个类,但是继承需要写到实现的前面,先继承后实现
-
一个接口可以继承多个接口
-
接口中也可以存放全局常量,默认为:public static final
-
-
练习
Usb
分析:
USB接口本身没有任何实现
USB接口规定了数据的传输要求
USB接口可以被多种USB设备实现
USB: service()
java实现:
步骤一:编写USB接口 —-> 根据需求设计方法
步骤二:实现USB接口 —-> 实现所有方法
步骤三:使用USB接口 —-> 使用多态的方式使用接口
/** * USB接口 * */ public interface UsbInterface { /** * USB接口提供服务 */ void service(); } 示例代码:(USB风扇) 示例代码:(USB U盘) package com.woniu.usb; /** * USB风扇 * */ public class UsbFan implements UsbInterface { @Override public void service() { System.out.println("连接USB接口,获得电流,风扇开始转动"); } } package com.woniu.usb; 示例代码:(测试类) /** * U盘 * */ public class UDisk implements UsbInterface{ @Override public void service() { System.out.println("连接USB接口,开始传输数据"); } } package com.woniu.usb; public class Test { public static void main(String[] args) { //1、创建U盘 UsbInterface uDisk = new UDisk(); //多态方式 uDisk.service(); //2、创建风扇 UsbInterface usbFan = new UsbFan();//多态方式 usbFan.service(); } }
二、接口应用场景
有很多重复代码,但是没有办法用is a的原则找到一个共同的父类,我们可以考虑将重复代码所体现的能力提取到接口中,让不同的实现类实现,调用者传递不同的实现类对象,调用不同类重写过的方法,体现了多态特性,提高项目的可扩展性和可维护性
打补丁 ,规定可以做什么,对已有功能进行扩展,但是并不想修改已有类型或者并不想让继承体系变得复杂,就可以使用接口扩展以后的功能
分析:
防盗门是一个门 ——> is a 的关系
不是所有的门都有防盗能力,防盗门可以上锁,可以开锁
如果使用继承,将门分为防盗门和普通门,会导致继承关系复杂,使用接口表示防盗的这种能力
练习:
1、原始的手机,可以发短信,通电话。随着发展,
手机增加了功能:音频、视频播放、拍照、上网
面向接口的编程:主体结构使用接口去进行搭建
三、接口和抽象类的区别:
-
接口中不能写实例属性(非静态属性),但是抽象类中可以写实例属性,如果说在父类中想定义一些实例属性体现所有子类通用的属性,那么只能选择使用抽象类,如果没有上述需求,接口和抽象类都可以,那么优先使用接口,因为接口会更灵活一些。
-
抽象类中可以写构造方法,代码块等,接口没有构造方法,代码块
-
接口和类之间的关系是实现关系,不一定满足is a的原则,但是抽象类是属于继承体系,需要满足is a的原则
-
接口和接口之间可以有继承关系,并且是多继承,类和类之间的继承关系是单继承
-
一个类可以实现多个接口,但是一个类只能继承一个类
四、Jdk1.8之后可以在接口中定义非抽象方法:default方法以及静态方法
静态方法:
使用接口名称调用
Default方法
如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法
如果子类继承父类,父类中有b方法,该子类同时实现的接口中也有b方法(被default修饰),那么子类会继承父类的b方法而不是继承接口中的b方法
五、内部类
匿名内部类
匿名内部类在创建的时候使用一次,必然是一个实现类或者,子类,每次创建对象都想对接口中的方法或者父类中的方法做不同的实现,可以考虑使用匿名内部类,内部类编译之后的字节码文件中包含$符号