目录
为什么有接口
基本介绍
接口的应用场景
注意事项和细节
接口和继承类的比较
总结
>接口和继承解决的问题不同
>接口比继承更加灵活
>接口在一定程度上实现代码解耦
接口的多态特性
多态参数
编辑
多态数组
多态传递
编辑
为什么有接口
usb插槽就是现实中的接口. 你可以把手机, 相机, u盘都插在usb插槽上, 而不用担心哪个插槽是专门插哪个的, 原因是做usb插槽的厂家和做各种设备的厂家都遵守了统一的规定包括尺寸,排线等等。
这样的设计需求在java编程/php/.net/go中也是会大量存在的,一个程序就是一个世界, 在现实世界存在的情况,在程序中也会出现。我们用程序来模拟一 下。
在接口中也去规定两个方法
phone去实现这个接口 , 必须要去实现接口规定的方法
相机也去实现这个接口 , 必须要去实现接口规定的方法
在计算机类的方法中, 就可以直接把接口接进来放在形参中(就像现实中把手机相机通过usb连接电脑)
实例化手机和相机后, 直接接入到电脑的方法中, 电脑便可以执行手机相机的内容
基本介绍
接口就是给出一些没有实现的方法,封装到一起到某个类要使用的时候,在根据具体情况把这些方法写出来。
语法:
interface接口名{
//属性
//方法
}
class 类名 implements 接口{
自己属性;
自己方法;
必须实现的接口的抽象方法
}
小结:
1.在Jdk7.0前接口里的所有方法都没有方法体,即都是抽象方法。
2. Jdk8.0后接口可以有静态方法,默认方法,也就是说接口中可以有方法的具体实现
接口的应用场景
对初学者讲, 理解接口的概念不算太难, 难的是不知道什么时候使用接口
下面我例举几个应用场景:
1.说现在要制造战斗机, 武装直升机, 专家只需把飞机需要的功能/规格定下来即可,然后让别的人具体实现就可。
2.说现在有一个项目经理,管理三个程序员功能开发一个软件,为了控制和管理软件,项目经理可以定义一些接口,然后由程序员具体实现。 (使得下面的类规范, 确定方法名调用形式, 能够更好的控制软件的质量, 它的功能, 接口还涉及到同一调用的问题-->接口编程)
例如这有一个要求:
要求3个程序员,编写三个类,分别完成对Mysql,Oracle,DB2数据库的连接 connect, close.
这里三个程序员第一个用的方法名f1() ,f2(); 第二个用的con(), close(); 第三个用的 connect(), close()
假使这里有一个类, 要去连接这三个数据库, 会发现方法命都没办法统一, 要去分别调用这几个方法, 非常的麻烦
如果用接口去管理这几个类, 要求三个类都去实现这个接口, 方法名就同一了
直接创建三个类的对象, 把它放到这个接口里面就知道到底需要连哪个数据库了
注意事项和细节
1) 接口不能被实例化
2) 接口中所有的方法是public方法, 接口中抽象方法, 可以不用abstract 修饰
3) 一个普通类实现接口, 就必须将该接口的所有方法都实现
4) 抽象类实现接口, 可以不用实现接口的方法
5) 一个类同时可以实现多个接口
6) 接口中的属性,只能是final的,而且是public static final修饰符
比如: int a=1;实际上是public static final int a=1;(必须初始化)
7)接口中属性的访问形式: 接口名.属性名
8)一个接口不能继承其它的类,但是可以继承多个别的接口
[举例] interface A extends B,C{}
9) 接口的修饰符只能是public和默认,这点和类的修饰符是一样的
接口和继承类的比较
以下图为例, 小猴子要学会爬树, 只需要继承老猴子就可以了, 因为本来猴子天生就会爬树, 但是如果小猴子还想要飞行, 想要游泳, 就需要去实现 , 因为这些不是他会的, 所以可以说在Java机制中接口是单继承的一种补充
代码
定义一个猴子类
小猴子去继承
这里可以直接打印出来猴子天生就会爬树了
定义一个接口游泳, 小猴子去继承并实现
猴子也可以游泳了, 就是继承的一种补充机制
同理, 再去实现一个小鸟接口 ,猴子也可以飞行了
小结:
当子类继承了父类,就自动的拥有父类的功能
如果子类需要扩展功能,可以通过实现接口的方式扩展
可以理解实现接口是对java单继承机制的一种补充
总结
实现接口vs继承类
>接口和继承解决的问题不同
继承的价值主要在于:解决代码的复用性和可维护性。
接口的价值主要在于:设计,设计好各种规范(方法),让其它类去实现这些方法。
>接口比继承更加灵活
接口比继承更加灵活,继承是满足is - a的关系,而接口只需满足 like - a的关系。
>接口在一定程度上实现代码解耦
接口的多态特性
多态参数
为什么camera和phone都可以传进去work当中, 是因为都实现了UsbInterface接口, 这里就体现除了接口多态参数
多态数组
可以把手机对象和相机对象同时放在接口数组里, 通过((Phone) usbs[i]).call();向下转型去分别调用各自的方法
多态传递
一个接口继承另外一个接口, 继承这个接口的类同时继承了它, 如果IH中有方法, 那么Teacher中也可以重写它, 这就是多态传递;
注意: 如果c继承的b和实现的a中都有x, 不能直接使用, 应为编译器不知道是谁, 接口因为定义的属性实际上是public static final的常量, 所以用类名点去访问, 继承的父类则用super访问