接口
Java提供了一个关键字interface定义接口。
public interface oil { //成员变量(常量) // 成员方法(抽象方法) String SCHOOL_NAME="itheim"; // public abstract 可以省略 public abstract void run(); void stop(); }
jdk8之前,接口中只能定义常量和抽象方法
-
接口不能创建对象
-
接口是用来被类实现的,实现接口的类称为实现类,一个类可以同时实现多个接口
//test为实现类,同时实现多个接口 //实现类实现多个接口,必须重写接口中的所有抽象方法 public class test implements A ,B{ @Override public void run() { } @Override public void play() { } }
接口的好处
-
弥补了类单继承的不足,一个类可以同时实现多个接口,使类的角色更多,功能更强大
-
让程序可以面向接口编程,这样程序员可以灵活方便的切换各种业务实现,更有利于程序的解耦合
//test为实现类,同时实现多个接口 //实现类实现多个接口,必须重写接口中的所有抽象方法 public class test { public static void main(String[] args) { People p=new Student(); Boy b=new Student(); Driver d=new Student(); // 解耦合 Driver d1=new Teacher(); Driver d2=new Student(); } } interface Driver{ } interface Boy{} class People{} class Student extends People implements Driver,Boy{} class Teacher implements Driver,Boy{}
接口新增的三个方法
jdk8开始,接口新增了三个方法
public class test { public static void main(String[] args) { AImpl a=new AImpl(); a.run(); A1.play(); } } public interface A1{ // 1.默认方法(普通实例方法),必须加default修饰,默认public修饰 使用接口实现类的对象来调用 default void run(){ System.out.println("A.run()"); } // 2.私有方法 jdk9支持 使用接口中的其他实例方法来调用 private void stop(){ System.out.println("A.stop()"); } // 3.静态方法 默认public 修饰,只能使用当前接口名来调用 static void play(){ System.out.println("A.play()"); } } class AImpl implements A1{ }
为什么要新增这些方法?
-
增强接口能力,便于项目扩展和维护
接口的注意事项
public class test { public static void main(String[] args) { } } //1.接口与接口可以多继承,一个接口可以同时继承多个接口 //类与类,单继承,一个类只能继承一个直接父类 //类与接口,多实现,一个类可以同时实现多个接口 //接口与接口,多继承,一个接口可以同时继承多个接口 //2.一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承、多实现 class A1 implements B1,C{ @Override public void run() { } @Override public void play() { } } interface B1{ void run(); } interface C{ void play(); } //3.一个类继承了父类,又实现了接口,如果父类和接口中有同名的方法,实现类会优先用父类的 class A2 extends B2 implements C2{ public void go(){ run();//父类 super.run();//父类 C2.super.run();//C2接口的方法 } } class B2{ public void run(){ System.out.println("B2"); } } interface C2{ default void run(){ System.out.println("C2"); } } //4.一个类实现了多个接口,如果多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可 class A3 implements B3,C3{ @Override public void run() { System.out.println("self"); B3.super.run(); C3.super.run(); } } interface B3{ default void run(){ System.out.println("B3"); } } interface C3{ default void run(){ System.out.println("C3"); } }