Java课程 - Java的接口详解
什么是接口
上一次,我们讲了继承。具体内容大家可以翻阅一下之前的文章。
https://blog.csdn.net/ming2r/article/details/101052528
今天,我们来讲一讲什么是接口,以及如何使用接口。
按照惯例,我们先来看一看官方的定义。
Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
翻译一下,接口就是定义规范。每一个类,都可以实现这些接口,然后按照自己的方式去实现。例如,每一个人都会说话,所以我们可以定义一个“说话”的接口。但是每一个人说的语言又不相同,我们就可以通过对“说话”这个接口进行实现,这样每一个人说的语言就不同了。
为什么要使用接口
之所以要使用接口,其实相当于做了一下规范。规定每一个实现这个接口的方法,不能随意修改所制定的方法。
同时,也提供了灵活性,规范是定义好了,但是具体怎么实现,是可以通过不同的类去实现的。
一方面,即规定了限制,又提供了灵活性。在实际项目的使用中,精简了项目结构,可以提供很好的阅读感受。
今后,我们加上Spring的强大注入功能,在实际项目中再进行讲解。
如何使用接口
变量的定义
举个例子。我们定义一个PersonInterface接口,同时定义name以及age两个属性。
可以看到,public、static两个修饰词都是灰色,即说明,其实它们是可以省略的。
接下来,我们来试着引用一下这两个变量。
可以看到,不管有没有使用public、static修饰,我们都可以直接引用到这两个变量。
方法的定义
我们来定义一个say方法。
可以看到,这个say方法,是没有任何的代码的,就是空荡荡的。那么,我们该如何去使用它呢?
我们再建一个类,EnglishPersonImpl,接着我们实现一下PersonInterface这个接口。
可以看到,IDEA已经提示错误了,说明我们没有实现PersonInterface里面的方法,我们来实现一下。
如下图,现在已经可以了。我们来实现一下say方法。
我们来试着调用一下。
打印结果为:说英文
这就说明我们的实现类已经正确写好了。
如果我们又有一个说日文的同学,那么我们就再定义一个JapanesePersonImp类,然后实现PersonInterface接口,接着实现say方法即可了。
接口的特点
写完了例子,我们来总结一下接口的特点。
- 接口不是class,而是interface
- 接口中所有的成员变量,默认都为public、static、final,且都必须初始化。
- 接口中没有构造方法,不能被实例化
- 一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口
接口与抽象类的区别
(1)抽象类
- 1、抽象方法必须存在于抽象类中。
- 2、类声明abstract,只能被继承使用。
- 3、子类继承抽象类必须实现其中的抽象方法,除非子类为抽象类。
(2)接口
- 1、接口里面的方法默认都是public abstract,也就是接口里面只能有抽象方法,不能有普通方法,而抽象类是可以有普通方法的。
- 2、接口只能定义静态常量属性,而抽象类既可以定义静态常量属性,也可以定义普通属性。
- 3、接口不包含构造方法,抽象类包含可以构造方法。
JDK1.8新特性
在JDK1.8对接口新增了两个修饰词,static以及default,我们来看一看、
static修饰的方法可以直接用接口名去调用就可以,default修饰的方法,实现接口的类不需要实现该方法。
public class PersonInterfaceTest {
public static void main(String[] args) {
PersonInterface person = new EnglishPersonImpl();
person.say();
person.jump();
PersonInterface.eat();
}
}
运行之后的结果为:
说英文
跳跃
吃饭
总结
我们详细讲了接口与接口的实现,可能很多人会觉得,这不是多此一举吗?
但是,在大型项目当中,最重要的一点,就是结构清晰,代码简洁。不管是否使用接口、继承、抽象类,最重要的一点,就是要保证代码的简洁、结构的清晰。
抛开简洁与清晰,单纯、盲目地使用接口、继承、抽象类,也是不正确的。
所以,大家也谨记这一点,在今后自己的项目中,要进行权衡,而不是盲目地使用。