接口:
如果一个类定义时全部由抽象方法和全局变量组成,那么这种类就称为接口。
抽象方法只有方法声明,而没有方法体,即没有实现细节。抽象方法使用abstract修饰;
全局变量,默认使用static和final修饰,又称为接口中的域。
使用关键字interface(而不是class)定义一个接口。
接口使抽象的概念更深入了一层,可将其想象为一个“纯”抽象类
1.不能对接口直接进行对象的实例化操作;
2.接口中只有全局常量,没有成员变量,所以接口中不能有构造方法;
3.接口的实现类使用implements关键字实现接口;
4.接口的实现类(如果不是抽象类)必须重写接口中所顶一顶全部抽象方法;
5.一个接口可以继承扩展多个父接口;
6.一个类可以实现多个接口
7.利用接口的子类,采用对象的向上转型方式,进行接口对象实例化操作。
java中的接口类似于日常生活中接口的作用:
-
java中的接口规定了很多类都需要具有的功能,不同的类(不一定有继承关系)可以实现相同的接口,同一个类也可以实现多个接口。
-
接口只关心操作,并不关心操作的具体实现,我们可以把主要精力放在程序设计上,而不必拘泥于细节的实现
-
通过在接口中声明若干个抽象方法,表明这些方法的重要性,方法体的内容细节由实现接口的类去完成。
-
接口可以实现与类的多重继承同样强大的功能,一个接口可以继承自多个父接口,一个类可以实现多个接口。
接口的定义与使用:
接口的定义和类的定义很相似,分为接口的声明和接口体
接口体包含常量定义(可以没有)和方法定义两部分:
-
所有常量的访问权限一定都是public,而且允许省略public,final,static修饰符;
-
所有的变量必须是public static final------全局常量
-
没有构造方法,接口不能用new运算符实例化
-
所有方法都是抽象方法,没有普通方法,其访问权限一定都是public,而且允许省略public,abstract修饰符(所有成员方法必须是公共的抽象实例方法)。例如:
interface Printable{ public static final int max = 100; //等价写法:int max = 100; public abstract void add(); //等价写法:void add(); public abstract float sum(float x,float y); }
接口支持多重继承
interface 接口名 extends 接口1,接口2......{......}
接口继承也是使用extends关键字。继承的接口方法也是public与abstract的
如果父接口中的接口方法有重复,则进行归并。
一个类通过使用关键字implements 声明自己实现一个或多个接口。如果实现多个接口,则用逗号将接口名隔开。语法格式:
class 类名 implements 接口1,接口2,.......{.......}
如果一个类实现了一个或多个接口,则该类必须实现该接口或所有接口的所有抽象方法。
在重写接口方法时不仅要去掉abstract修饰符,给出方法体;而且方法的访问权限一定要明显的使用public来修饰,否则会降低访问权限
一个类可以在继承某个类(只能一个,而且可以是抽象类)的同时实现一个或者多个接口,例如:
class Dog extends Animal implements Entable,Sleepable{ ... }//Dog类在继承父类Animal的同时实现Eatable和Sleepable两个接口 //注意:implements如果存在的话必须在最后,不能在extends前
通过import语句引入包中的接口:
通过import语句不仅可以引入jdk包中的类,也可以引入包中的接口,
例如:import java.io.*;
( 需要注意以下几点
-
类重写的接口方法以及接口中的常量可以被类的对象调用,而且常量也可以用类名或接口名直接调用;
-
声明接口使如果在关键字interface前面加上public关键字,就称这样的接口是一个public接口,它可以被任何一个类声明实现,否则,如果没有public,它只能被与该接口在同一个包中低端类声明实现;
-
如果父类实现了某个接口,那么其子类也就自然实现了该接口;
-
接口也可以被继承(仍通过关键字extends声明),字接口将继承父接口中的所有方法和常量。
-
如果一个类声明实现某个接口,但没有重写接口中的所有方法,则该类必须是抽象类
)
由于类实现接口,必须实现所有的接口方法,这对程序员来说很不方便,java语言中提出了适配器的概念来解决
所谓适配器就是实现接口,并对接口中的接口方法提供空实现。
空实现就是有方法体,但方法体中基本上不提供任何有效代码
利用接口也可以体现程序设计的所谓“开—闭”原则(open-closed principle),即强调一个程序应当对扩展开放,对修改关闭,增强代码的可维护性。
接口回调:
接口回调是指把实现某一接口的类创建的对象的引用赋给该接口声明变量中,那么该接口变量就可以调用被类重写的接口方法;
接口与多态:
由接口产生的多态就是不同的类在实现同一个接口时可能具有不同的实现方式,那么接口变量在回调接口方法时就可能具有多种形态
接口与抽象类的异同:
共同点:都有抽象的行为,约束了她们的实现者(类)或者子类必须实现的业务功能。
接口中所有的行为都是抽象行为;
抽象类通常都有抽象行为。(可以有抽象方法也可以没有抽象方法)
不同点:抽象类与其子类从大的范畴来讲它们属于同一个类型(或者同一种事物),抽象行为也决定了它的所有子类应该具有的行为。因此,抽象类是对属于同一种类型的不同事物的共同行为的一种抽象或表达;
接口中的抽象行为可以被任何类实现,实现这个接口的类可以是不同的类(这些类之间毫无关系)。因此,接口是对不同种类型的事物行为的一种抽象
接口的特点:
-
接口中只可以有public修饰的抽象方法,不能有非抽象方法
-
接口有类去实现,即一个类如果实现一个接口,那么它必须重写接口中的抽象方法
-
可以把实现某一接口的类所创建的对象的引用赋给该接口声明的接口变量;(接口通过其实现类进行实例化)
-
然后该接口变量就可以调用被实现类所实现的接口方法。这就是接口回调