在学习过继承、多态和抽象类的基础上,我们又学习了接口。
接口是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···{}接口也能使用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() { } }