提示:书接上回,我们已经提到过了抽象类,抽象类存在的意义就是被继承,一个普通类如果继承抽象类,那么就必须重写抽象类中的抽象方法,我们也提到过可以解决不重写的方法,但是随着我们学习的深入,就必须要有一个规范来真正解决这一问题。那么这篇关于接口的文章就可以解决心中的疑惑。
接口
接口的概念
我们在现实生活中碰到到的接口有哪些,电脑的USB接口,手机的Type-c🔋充电接口,在Java中接口的定义是⬇️:
接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
通俗点来说,接口是一种规范,如果你想用这个接口,你必须实现我的规范。在Java中,接口可以看成是多个类的公共规范,是一种引用数据类型。
简单介绍接口
提示:一个Java文件要么是一个类或者是一个接口
我们在建立一个接口时,同样是右击src文件,选中interface,生成一个接口。
注意:
- 接口的定义和类的定义是差不多的,只需要将class换成interface
- 创建接口时,接口的命名都是以大写的字母I开头,这样就是定义了一个接口
- 接口的命名一般是以形容词的单词,比如Shape形状,Aniaml动物,这样一个具有统称,包含多种实例的名称
接口的特点
接口也是有属性和方法的,接口的声明中方法默认是抽象方法(方法没有方法体)
接口有以下特点需要记住
- 接口是表示一个类需要做哪些事情(想要实现这个接口,就必须重写它的方法)
- 我们将跑步设计成接口,狮子和狗都会跑步,你要想实现跑步这个接口接口,就必须按照我的规范来完成,才有资格去实现接口。
- 如果一个类实现了接口中的所有方法,没有方法体,那么这个类一定是抽象类,所以抽象方法只能存在于抽象类和接口中。
接口的语法规则
提示:接口不能直接使用,必须要有一个"实现类"来"实现"接口,实现接口中的抽象方法
子类和父类继承关系用extends,接口使用implements
interface ISahpe{
//实现一个接口,关键字 interface
abstract void func();
}
class Rect implements ISahpe{
//子类和父类继承关系是用extends,接口则使用implements实现关系
@Override
public void func() {
System.out.println("想要实现这个接口,就必须重写接口中的抽象方法");
}
}
public class Main {
public static void main(String[] args) {
}
}
关于接口的特性有多个,我们一一来解释
1.接口是一种引用类型,不能直接new对象
因为能包含抽象方法的只有抽象类能做到,而接口中是可以有抽象方法的,从某种意义上来说,接口也是一种抽象类,所以无法实现实例化。
2.接口只中的成员默认是使用,public static final修饰的,不写也不会报错。
3.接口中的方法默认是public abstract修饰的,不写也不会报错,如果使用其他修饰符都会报错。
4.接口中的方法不能在接口类中实现,只能由实现接口的类实现,通过关键字implements
接口中的方法是抽象方法,是不能直接实现的,所以必须要有一个类来实现接口中的方法。⬇️(下面代码是正确实现接口中的抽象方法)
interface IShape{
public abstract void draw();
}
class Retc implements IShape{
@Override
public void draw() {
System.out.println("画一个矩形");
}
}
class Flower implements IShape{
@Override
public void draw() {
System.out.println("画一朵花🌹");
}
}
public class Test {
public static void main(String[] args) {
IShape iShape=new Retc();
IShape iShape1=new Flower();
iShape.draw();
iShape1.draw();
}
}
5.从JDK8开始,可以开始写一个default修饰的方法,重写接口中的方法时,不能使用默认的访问权限
使用default去修饰方法的时候,这个方法可以有具体的实现,但是在重写的阶段如果还用default修饰的话,就会报错。这里和我们重写的概念是吻合的(重写的时候 子类的访问权限一定要大雨等于父类的访问权限,所以前面的public不能省略掉。)
6.接口中不能有静态代码块和构造方法
7.接口虽然不是类,但是接口编译完成之后字节码文件的后缀是.class