接口
interface关键字使得抽象的概念更向前迈进了一步。abstract关键字允许人们在类中创建一个或多个没有任何定义的方法——提供了接口部分,但是没有提供任何相应的具体实现,这些实现是由此类的继承者创建的。
interface这个关键字产生一个完全抽象的类,它根本没有提供任何具体实现。他允许创建者确定方法名,参数列表和返回类型,但是没有任何方法体。接口只提供了形式,并未提供任何具体实现。
格式:interface A{ } ,可以在interface关键字前添加public关键字(但仅限于该接口名与文件名相同)。如果不添加public关键字,则他只具有包访问权限,这样就他就只能在同一包内使用(当然也可以在同一类中使用)。
接口中的成员修饰符是固定的:
成员常量: public static final (全局常量)
(为什么接口中只有常量没有变量?
java 接口是一个纯粹的抽象类,不提供任何具体的实现,只是提供了一个协议,实现它的子类共同遵守这份协议。接口A中的属性a如果可以定义为静态变 量,那么就可以直接通过A.a=xxx;的方法直接修改该属性,而这样做是不安全的。因为接口中的属性是所有实现它的子类共享的,是全局常量,每一个更改 都会影响所有的子类。
接口中不允许方法的实现,而抽象类是允许方法实现的及定义变量的,因此我们可以看出接口是比抽象类更高层次的抽象。如果接口可以定义变量,但是接口中的 方法又都是抽象的,在接口中无法通过行为(例如set()方法)来修改属性。那么有些人就会提出可以通过实现接口的类的实例来修改接口的属性。那好,如果 接口中有一变量c,我们通过实现它的A类对象改变了c的值,那么实现接口的B类,C类中的c变量都要跟着改变,可想而知这样就会造成混乱。
所谓的抽象,就是把一些不可改变的东西放在一起,而可变的东西往往放在实现里面。
接口,实际上它是对一类事物属性和行为的高层次抽象,它体现的是OCP(对修改关闭,对扩展开放)的原则。
为什么接口中的常量都是用static修饰的?
若一个类实现的多个接口中包含相同的成员常量,则在引用该常量时将无法判别使用的是哪个接口的成员常量,所以成员常量必须被static(静态的、全局的)修饰。
成员函数: public abstract (抽象方法)
即接口中的成员权限都是public的。
类与类之间是继承关系,类与接口之间是实现关系。
接口与接口之间是继承关系,而且接口可以多继承。
接口不可以实例化,只能由实现了接口的子类并覆盖了接口中所有的抽象方法后,该子类才可以实例化。否则这个子类就是一个抽象类。
在java中不直接支持多继承,因为会出现调用的不确定性(1.若子类继承的父类中拥有相同的成员变量,子类在引用该变量时将无法判别使用哪个父类的成员变量。2.若一个子类继承的多个父类拥有相同方法,同时子类并未覆盖该方法(若覆盖,则直接使用子类中该方法),那么调用该方法时将无法确定调用哪个父类的方法。)所以java将多继承机制进行改良,在java中变成了多实现,即一个类可以实现多个接口。)
接口的出现避免了单继承的局限性。
接口的特点:
1.接口是对外暴露的规则。
2.接口是程序的功能扩展。
3.接口的出现降低了耦合性。
4.接口可以用来多实现。
5.类与接口之间是实现关系,而且类可以在继承一个类的同时实现多个接口。
6.接口与接口之间可以有继承关系,而且是多继承。
接口和抽象类在应用上的区别:
接口更多的是在系统架构设计方面发挥作用,主要用于定义模块之间的通信契约。
而抽象类在代码实现方面发挥作用,可以实现代码的重用。