1、接口
概念:封装了一组规范、标准
生活层面:
usb接口:
计算机厂商的角度:在设计计算机的过程中,如果多开辟几个usb口,
则可以让更多的外接设备在同一时间都连接上我的计算机
外接设备厂商的角度:如果想要让自己的产品能够连接访问计算机,
则需要提供该接口的具体实现。
程序层面:
我们之后会学习jdbc技术(java连接访问数据库的技术)
jdbc内部封装了众多的接口(一组接口):
connection接口 ==》 获取连接
Statement接口 ==》 执行sql语句
ResultSet接口 ==》 结果集
...
市面上主流的关系型数据库产品有哪些?
mysql、oracle、db2、MsSql...
主流的数据库厂商都想要让Java去连接访问它们自己的数据库产品,
则这些数据库厂商就需要提供jdbc中内部众多接口的具体实现。
说点通俗易懂的:
多个类它们内部都需要设计某方法,但是这些类之间不存在继承关系,也不再同一个继承体系下;
根据我们之前的思路,就需要在这多个类中都定义一遍该方法,显然程序代码的复用性就无法保证的;所以Java设计者提出来接口这种技术,将该方法定义到某接口中,让这多个类都去实现该接口;则这多个类就都具备了该方法行为。
举例:
类:Kite、Plane、Bird
方法:fly
接口:FlyAble
1)、接口的定义
关键字:interface
格式:
interface 接口名{
//...
}
2)、类实现接口
关键字:implements
格式:
interface 接口名{
//...
}
class 类名 implements 接口名{
//...
}
3)、接口内部可以定义哪些成员
jdk1.8(java8)版本以前:内部只能定义常量和抽象方法
常量:
public static final 数据类型 常量名 = 常量值;
简化形式:
数据类型 常量名 = 常量值;
抽象方法:
public abstract 返回值类型 方法名(形参列表);
简化形式:
返回值类型 方法名(形参列表);
2、接口注意事项:
1)、定义接口需要使用关键字interface,而不是class;
2)、java8版本以前接口内部只能定义两类成员:①.常量 ②.抽象方法;
3)、类实现接口需要实现关键字implements;
4)、实现接口的类将其称为接口的实现类;
5)、类实现接口需要实现/重写接口内部所有的抽象方法,则该类就是一个具体类,之后可以实例化对象,否则该类必须被定义为抽象类;
6)、接口不可以实例化/创建对象;
7)、接口存在的意义就是为了给类实现的;
8)、接口不是类内部没有构造方法;
9)、接口和实现类之间存在多态性的表现,具体表现如下:接口类型的引用 指向 实现类的对象;
10)、接口和接口之间可以多继承,类和类之间只能单一继承;
11)、类可以在继承父类的同时去实现多个接口,但是有语法要求,具体要求如下:
必须先继承,后实现;格式如下:
class 类名 extends 父类名 implements 接口名1,接口名2,...,接口名n{
//...
}
jdk1.8(java8)版本以后 ==> 称为java8接口相关的新特性
除了之前的常量和抽象方法,接口内部还可以定义静态方法和默认方法
静态方法:
public static 返回值类型 方法名(形参列表){
//...
}
默认方法:
public default 返回值类型 方法名(形参列表){
//...
}
【问题】:为什么会引入默认方法这种技术?
搭建场景:
开发某企业级项目的过程中,在某模块内部需要定义某接口,其内部需要设计若干个抽象方法,之后有多个类(30个)都需要实现该接口,则这些类都需要在发生实现关系的一刹那,提供这若干个抽象方法的具体实现;随着项目进度往后走,需要在该接口内部去追加5个新的功能,此时如果将这5个新的功能设计为抽象方法的话,则之前和该接口发生过实现关系的30个类都会在第一时间出现编译报错的现象!并且有部分类(10个)对于这些新的功能并不关注,但是为了满足Java语言的语法要求,这30个类都需要显示的对于这些新的功能进行方法的实现 ==> 问题:影响开发效率,所以Java设计者提出了默认方法这种技术,从格式定义上我们就看出了是有方法体的方法,将这些需要新追加的功能都设计为默认方法,则之前和该接口发生过实现关系的类,都不会第一时间出现编译语法报错现象;和这些新功能都关联的类我们考虑是否要进行方法的重写等操作;不关注这些新功能的类则直接无视即可。
3、接口的静态方法和默认方法注意事项:
1)、接口内部定义的静态方法只能通过接口名对其进行访问调用;
2)、接口和父类中定义了相同名字的默认方法和非静态方法,子类继承父类的同时去实现该接口,在外界实例化子类对象,对象访问调用该方法,默认情况下,执行的是父类中的非静态方法 ==> 原因:类优先原则,如果想要访问执行的是接口中的默认方法,则必须在子类/实现类的内部;显示的重写该方法:
格式如下:
接口名.super.方法名(...);
3)、多个接口内部都定义了相同名字的默认方法,类同时去实现这多个接口,则在搭建时间关系的一刹那,会出现编译语法报错的现象! ==> 原因:接口冲突问题,所以我们需要显示的去重写该默认方法,这样才可以过编译。
本电子书目录:《Java基础的重点知识点全集》