第5章-第7节-Java面向对象编程之接口

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基础的重点知识点全集》

相关推荐
hqxstudying2 小时前
Java异常处理
java·开发语言·安全·异常
我命由我123454 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
武子康7 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
YuTaoShao9 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw9 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨10 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
双力臂40410 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空11 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
QQ_43766431411 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿00111 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式