在学习过继承、多态和抽象类的基础上,我们又学习了接口。
接口
接口
接口是Java语言中的一种引用类型,是一系列方法的声明,方法特征的合集,也是一种标准。
- 如果说类的内部封装了成员变量、成员方法和构造方法;
- 那么接口的内部主要封装了方法
- 抽象方法(JDK7之前一直有)
- 默认方法(JDK8加入)
- 静态方法(JDK8加入)
- 私有方法(JDK9加入)
- 接口的定义和类相似,但是他使用interface关键字,他也会被编译成class文件,但是它不是类,而是一种引用数据类型
- 接口不能创建对象,但是可以被是实现(implements),类似于被继承。
- 一个实现接口的类,需要实现接口中所有的抽象方法,否则就将它定义为抽象类(让他的子类再去实现)
- 接口的特点:
- 接口中不能有构造方法,也不能创建对象
- 接口中主要有抽象方法(只有方法声明,没有方法体)
- 接口中的抽象方法只能用public修饰,不加默认也是public
- 接口中的变量都是静态的常量,
- 因为变量前面默认的修饰符就是public static final(写不写都一样)
- 可以直接通过接口名访问(接口名.变量名)
- 接口需要类来实现,一个类可以实现多个接口
- 接口可以继承多个父接口,从而接口实现了多继承
接口的定义和实现
接口的定义:
interface 接口名{
常量;
抽象方法;
静态方法;
默认方法;
私有方法;
}
接口的实现:
class 类名 implements 接口名{
//其中要实现接口中的抽象方法
//也可以重写接口中的默认方法
}
抽象方法
没有方法体,供子类实现
- 使用abstract关键字修饰,但是在接口中可以省略
定义方法:
interface MyInter01{
public abstract void method();//前面的修饰符都可以去掉
}
实现:
class InterImpl implements MyInter01{
public void method(){
System.out.println("类中实现的抽象方法");
}
}
默认方法
供实现类 使用或者重写
- 可以被子接口继承
- 可以被实该接口的类继承
- 子接口中如有同名默认方法,父接口的默认方法会被覆盖
- 不能通过接口名调用
- 需要通过接口实现类的实例进行访问
- 使用default关键字修饰
定义方法:
interface MyInter01{
public default void method(){
System.out.println("MyInter01的默认方法");
};
}
调用:
默认方法可以直接继承,也可以重写,
class InterImpl implements MyInter01{
public void method(){
System.out.println("重写接口中的默认方法");
}
}
静态方法
接口自己使用,属于接口
- 可以直接使用接口名调用
- 不可以通过实现类的类名或者实现类的对象调用
- 使用static关键字修饰
定义方法:
interface MyInter01{
public static void method(){
System.out.println("MyInter01的静态方法");
};
}
调用:
MyInter01.method();
私有方法
实际开发中,当多个默认方法有重复的内容时,就可以将这些内容抽取出来,封装到私有方法中,供这个接口自己使用
- 私有方法和私有静态方法的区别:
- 私有方法只能被默认方法调用
- 私有静态方法可以被默认方法和静态方法调用
- 使用private修饰
定义方法:
interface MyInter01{
private void privateTest(){
System.out.println("私有方法");
}
private static void priStaTest(){
System.out.println("静态的私有方法");
}
}
调用:
interface MyInter01{
private void privateTest(){
System.out.println("私有方法");
}
private static void priStaTest(){
System.out.println("静态的私有方法");
}
public default void mothod(){
privateTest();
priStaTest();
}
}
接口的多实现
在继承中一个子类只能继承一个父类,但是对接口而言,一个类可以实现多个接口,这就叫做接口的多实现。(一个类可以继承一个父类和多个接口类)
访问修饰符 class 类名 extends 父类 implements 接口1,接口2,接口3···{}
一个类中实现多个接口时(接口的多实现),出现的一些情况:
抽象方法有重名,只需要重写一次
interface MyInter01{
public void method();
}
interface MyInter02{
public void method();
}
class InterImpl implements MyInter01,MyInter02{
//只需要实现一个抽象方法
public void method(){
}
}
默认方法有重名,必须重写一次
interface MyInter01{
public default void method(){
System.out.println("MyInter01的默认方法");
};
}
interface MyInter02{
public default void method(){
System.out.println("MyInter02的默认方法");
};
}
class InterImpl implements MyInter01,MyInter02{
//必须要重写一次默认方法
public void method(){
System.out.println("实现类中重写的默认方法");
}
}
静态方法有重名时,不会发生冲突(因为静态方法只能使用自己的接口名调用)
interface MyInter01{
public static void method(){
System.out.println("MyInter01的静态方法");
};
}
interface MyInter02{
public static void method(){
System.out.println("MyInter02的静态方法");
};
}
class InterImpl implements MyInter01,MyInter02{
public void a(){
//调用方法不同,不会冲突
MyInter01.method();
MyInter02.method();
}
}
接口的多继承
接口也能使用extends继承接口,并且可以继承多个接口(接口之间还是用逗号分隔开)
如果一个类实现了子接口,那么就要实现子接口和父接口中的所有抽象方法
(如果两个父接口中有重名的默认方法,也需要子接口来重写一次!)
interface MyInter01{
//默认方法
public default void method(){
System.out.println("MyInter01的默认方法");
};
//MyInter01中的抽象方法
void method01();
}
interface MyInter02{
//默认方法
public default void method(){
System.out.println("MyInter02的默认方法");
};
//MyInter02中的抽象方法
void method02();
}
//子接口MyInter03 继承父接口MyInter01和MyInter02
interface MyInter03 extends MyInter01,MyInter02{
//两个父接口中有重名的默认方法method(),需要重写这个方法
public default void method(){
System.out.println("子接口MyInter03的默认方法");
};
//MyInter03中的抽象方法
void method03();
}
//实现类实现子接口
class InterImpl implements MyInter03{
//需要把父接口(MyInter01、MyInter02)和子接口(MyInter03)中的抽象方法全部实现
@Override
public void method01() {
}
@Override
public void method02() {
}
@Override
public void method03() {
}
}