1、接口的概念和定义语法
接口的概念:
接口是多个类共同的公共行为规范,这些行为都是与外部交流的通道,以为接口需要提供一组公用的方法,供子类去实现
从多个相似的类中抽象出来的规范,接口不提供任何的实现,接口的出现的目的就是规范和实现的分离的设计哲学。
面向接口编程的好处:尽量降低各模块之间的耦合,为系统提供工号的拓展性和可维护性。
语法:接口的定义
[修饰符] interface 接口名 extends 父接口1,父接口2...{
零个到多个常量定义...
零个到多个抽秀方法定义...
}
说明:
- 修饰可以是
public
或者省略(省略的话默认采取权限访问控制符,只有在相同的包结构中才访问到该接口) - 接口的命名的规则和类名采取的命名规则相同,要遵循Java可读性规范,尽量做到见名知意,应该由多个有意义的单词组成,每个单词的首字母大写。
- 一个接口可以有多个直接的 父接口,但是接口只能继承接口,不是继承类。
对于接口中的常量:
// 在接口中如果省略了public static final修饰符,系统会自动添加上
int MAX_SIZE = 50;
public static final int MAX_SIZE = 50 ;
例如:
下面在接口中定义一个常量和一个抽象方法
public interface Write{
int MAX_WORD = 100;
// 这里等效于public static final int MAX_WORD = 100;
void write();
}
可以在类型直接使用接口的静态方法
public class TestGetMaxWord{
public static void main(String[] args){
// 可以直接获取
System.out.println("从接口Write中获取到MAX_WORD:" + Write.MAX_WORD)
}
}
接口是完全支持多继承的,也就是一个接口可以有多个直接父接口,一旦子接口继承了某个父接口,就获得了父接口里定义的所有抽象方法、常量属性、内部类和枚举类定义。
interface InterfaceA{
int PROP_A = 5;
void testA();
}
interface InterfaceB{
int PROP_B = 6;
void testB();
}
interface InterfaceB extends InterfaceA,InterfaceB{
int PROP_C = 7 ;
void testC();
}
public class TestInterfaceExtends {
pulbic static void main(String[] args){
System.out.printl("PROP_A"+InterfaceA.PROP_A);
System.out.printl("PROP_B"+InterfaceA.PROP_B);
System.out.printl("PROP_C"+InterfaceA.PROP_C);
}
}
2、Java 8 新增的接口特性
首先在JDK8之前,定义接口类中,类中的方法都是抽象的,并且不能存在静态方法,所有的方法命名规则都是使用了
public 【返回类型】【方法名】【参数】throws exception
在jdk8中接口新增了两种方法,default方法和static方法。
这说明了在JKDK8之后,在接口中可以有具体的方法实现,只不过需要被 default 和static修饰
例如:下面的情况现在是允许在Java的接口中出现的
public interface Calculate {
int add(int a, int b);
int sub(int a, int b);
// 默认方法
default int del(int a, int b) {
return a/b;
}
// 静态方法
static int multiply(int a,int b) {
return a*b;
}
}
3、面向接口编程
接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极好降低程序各个模块的耦合度,从而提高系统的可维护性和拓展性。
基于这种原则,很多框架设计理论都提倡 "面向接口"编程,而不是面向实现类编程,来达到降低程序的耦合的目的。