接口
接口的基本概念:
接口就是多个类的公共规范。
接口是一种引用数据类型,最重要的内容就是其中的:抽象方法
如何定义一个接口的格式:
public interface 接口名称{
//接口内容
}
备注:换成了关键字interface之后,编译生成的字节码文件仍然是:.java
如果是java 7,那么接口中可以包含的内容有:
1、常量
2、抽象方法
如果是java 8, 还可以包含的内容有:
3、默认方法
4、静态方法
如果**java 9,**还可以额外包含有:
5、私有方法
在任何版本的java中,接口都能定义抽象方法。
格式:
public abstract 返回值类型 方法名称(参数列表);
注意事项:
1**、接口中的抽象方法,修饰符必须是两个固定的关键字:public abstract**
2、这两个关键字修饰符,可以选择性的省略。
public abstract void methodAbs1();
//这也是抽象方法
abstract void methodAbs2();
//也是
public void methodAbs3();
//也是
void methodAbs4();
3、方法的三要素,可以随意定义、
接口抽象方法的使用
接口使用步骤:
1、接口不能直接使用,必须有一个实现类,来实现该接口。
格式:
public class 实现类名称 implements 接口名称{
//···
}
2、接口的实现类必须覆盖重写接口里面的所有抽象方法。
去掉abstract关键字,加上方法体大括号。
3、创建实现类的对象,再进行使用。
注意:
1、不能直接new接口对象使用。使用必须创建实现类对象来进行使用。
2、如果实现类并没有覆盖重写接口中所有的抽象方法,那么这个类必须是抽象类。
接口默认方法的定义和使用:
定义:
格式:
public default 返回值类型 方法名称(参数列表){
方法体
}
备注:接口当中的默认方法,可以解决接口的升级问题。
默认方法的使用:
1、接口的默认方法,也可以通过接口类对象,直接调用。
2、接口的默认方法,也可以被接口实现类进行覆盖重写。
接口静态方法的定义(从Java8开始)
定义格式:
public static 返回值类型 方法名称(参数列表){
方法体
}
接口中静态方法的使用
用法:通过接口名称,直接调用其中的静态方法。
格式:接口名称.静态方法名称(参数)
注意事项:不能通过接口实现类的对象来调用接口当中的静态方法。
接口:
public interface Interface{
//定义一个静态方法
public static void methodStatic(){
System.out.println("接口当中的静态方法");
}
}
实现类:(在此处只是提供案例,实际调用静态方法并不需要实现类)
public class InterfaceImpl implements Interface{
}
启动类:
public static void main(String[] args){
//错误写法,静态方法不能通过实现类对象来进行调用
/*
InterfaceImpl one = new InterfaceImpl();
one.methodStatic;
*/
//正确写法: 直接通过接口名称.静态方法
Interface.methodStatic();
}
运行结果:
接口当中的静态方法
接口中常量的定义
接口当中也可以定义**”成员变量“,但是必须使用public static final**三个关键字修饰。
注意:
1、一旦使用final关键字进行修饰,说明不可改变。
2、接口当中的常量,可以省略***public static final***。
3、接口当中的常量,必须进行赋值;不能不赋值。
格式:
public static final 数据类型 常量名称 = 数据值;
进行使用时:
接口名称.常量名称 //接口使用
继承父类并实现多个接口
使用接口时,需要注意:
1、接口是没有构造方法的
2、一个类的直接父类是唯一的,但是一个类可以同时实现多个接口、
public class A implements B, C{
//同时实现接口B和C
}
3、如果实现类的多个接口存在相同的抽象方法,那么只需要在实现类中覆盖重写一次即可(因为抽象方法没有方法体,不会产生冲突)。
4、如果实现类的多个接口存在相同的默认方法(因为默认方法存在着方法体,那么就会产生冲突)那么实现类一定要对冲突的默认方法进行覆盖重写。
5、一个类的直接父类中的方法和接口当中的默认方法产生了冲突,那么优先使用父类当中的方法。
接口之间的多继承
接口之间是多继承的,类与类之间是单继承的,一个类的直接父类只能有一个,而接口之间是多实现的,一个接口可以实现多个接口。
Demo:
接口A
public interface A{
}
接口B
public interface B{
}
接口C
public interface C extends A, B{
//接口C同时继承A,B两个接口。
}
注意:
1、多个父接口当中的抽象方法如果重复,没关系。
2、多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写,而且带有default关键字