Java接口
- 接口 (interface)在Java中表示一种规范或契约,它定义了一组抽象方法和常量,用来描述一些实现这个按口的类应该具有哪些行为和属性 接口和类一样,也是一种引用数据类型
- 接口怎么定义? [修饰符列表]interface 接口名仆}
- 抽象类是半抽象的,接口是完全抽象的。接口没有构造方法,也无法实例化
- (JDK8之前的语法规则)接口中只能定义:常量+抽象方法:接口中的常量的static final可以省略。接口中的抽象方法的abstract可以省略。接口中所有的方法和变量都是public修饰的
- 接口和接口之间可以名继承
- 类和接口的关系我们叫做实现(这里的实现也可以等同看做继承)。使用implements关键字进行接口的实现。
- 一个非抽象的类实现接口必须将接口中所有的抽象方法全部实现(强制要求的,必须的,要不然编译器报错。)
- 一个类可以实现多个接口。语法是:class类implements 接口A,接口B{}
- Java8之后,接口中允许出现默认方法和静态方法(JDK8新特性)
- 默认方法:引入默认方式是为了解决接口演变问题:接口可以定义抽象方法,但是不能实现这些方法。
所有实现接口的类都必须实现这些抽象方法。这会导致接口升级的问题:当我们向接口添加或删除一个抽象方法时,
这会破坏该接口的所有实现,并且所有该接口的用户都必须修改其代码才能适应更改。这就是所谓的"接口演变”问题 - 静态方法:注意:java中规定,在JDK8之后,接口中可以一定静态方法,但是这个静态方法,只能通过“该接口名”去调用的。别的都无法调用。
在JDK8之后引入接口可以定义静态方法,实际上想表达一个意思:接口也可以作为工具来使用了。
- JDK9之后允许接口中定义私有的实例方法(为默认方法服务的)和私有的静态方法(为静态方法服务的)
- 所有的接口隐式的继本0bject。因此接口也可以调用0bject类的相关方法
<----------------------------------------------------------------------------->
抽象类和接口虽然在代码角度都能达到同样的效果,但适用场景不同:
- 抽象类主要适用于公共代码的提取。当多个类中有共同的属性和方法时,为了达到代码的复用,建议为这几个类提取出来一个父类,在该父类中编写公共的代码。如果有一些方法无法在该类中实现,可以延迟到子类中实现。这样的类就应该使用抽象类。
- 接口主要用于功能的扩展。例如有很多类,一些类需要这个方法,另外一些类不需要这个方法时,可以将该方法定义到接口中。需要这个方法的类就去实现这个接口,不需要这个方法的就可以不实现这个接口。接口主要规定的是行为