一.接口的概念
接口是功能的集合,可看作是一种的数据类型,是比抽象类更抽象的类
接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样功能的定义与实现相分离,优化了程序设计
一切事物均有功能,即一切事物均有接口,接口就是功能的抽象
二.接口的声明
使用interface代替了原来的class,其他步骤与定义类的方式相同
public interface 接口名称 extends 其他的类或接口名{
//声明变量
//抽象方法
}
接口是隐式抽象的,当声明一个接口时,不必使用abstract关键字
三.接口的实现
当类实现接口的时候,类要实现接口中全部方法,否则该类声明为抽象类
类使用implements关键字实现接口
一个类如果实现接口,有两种操作方法;实现非抽象类需要重写接口中所有的抽象方法
实现抽象类,可以不重写接口中的抽象方法
class 类 implements 接口1,接口2...{
//重写接口方法
}
四.接口中成员变量的特点
接口中无法定义普通的成员变量
接口中定义的变量,必须有固定的修饰符public static final,所以接口的变量也称之为常量,不可改变
接口中的成员变量必须显式初始化
interface Demo{
public static final int num=3;
}
五.接口中成员方法的特点
接口中的成员都是public的,不能指定其他的访问修饰符
接口中的成员方法固定格式:public abstract 返回值类型 方法名字(参数列表)
子类必须覆盖接口中所有抽象方法后,子类才可以实例化,否则子类是一个抽象类
六.类和接口的多实现
将多继承这种机制在Java中通过多实现完成了
多继承的弊端:当多个父类中具有相同功能时,子类调用会具有不确定性
其原因在于多继承父类中功能有主体,调用时不确定运行哪个主体内容
多实现中由于接口中的功能都没有方法体,都是由子类或实现类重写来明确
七.接口的继承
一个接口能继承另一个接口,和类之间的继承方式比较类似。接口的继承使用extends关键字,子接口继承父接口的方法
在Java中,类的多继承是不合法的,但接口允许多继承。
八.接口与类的区别:
接口不能用于实例化对象
接口没有构造方法
接口中所有方法必须是抽象方法
接口不能包含普通成员变量,除了static和final变量
接口不是被类继承,而是被类实现
接口支持多继承
九.抽象类和接口的区别
相同点:抽象类和接口都位于继承的顶端,用于被其他类实现或继承
都不能直接实例化对象
都包含抽象方法,其子类都必须覆盖这些抽象方法
区别:抽象类中的方法可以有方法体,可以实现方法的具体功能,但是接口中的方法不行
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的
接口中不能含有静态代码块以及静态方法(用static修饰的方法)而抽象类可以有静态代码块和静态方法
一个类只能继承一个抽象类,而可以是实现多个接口
优先使用接口,尽量少用抽象类;需要定义子类行为又要为子类提供共性功能时才选择抽象类
十.接口中的方法是否可以被重写和覆盖
对于接口方法的重载,重载条件和普通类一样,只是重载方法没有方法体
接口中的方法也可以覆盖,但是接口中不提供方法的实现,所以无意义
十一.接口的新特性------默认方法和静态方法(jdk8之后)
默认方法
可以在不影响已有类的情况下,修改接口
可以有方法实现
父类中的默认方法可以被子接口继承
子接口可以覆盖父接口中的默认方法,甚至还可以把父接口中的默认方法覆盖为抽象方法
实现接口后,因为默认方法不是抽象方法,所以可以不重写,但是如果开发需要,也可以重写
默认方法使用default 关键字,只能通过接口实现类的对象来调用。
注意:默认方法的访问权限也是默认public
静态方法
可以有方法实现
可以直接通过接口名来访问
静态方法没有方法覆盖,因为静态方法没有运行时多态
interface Test{
//这个是默认方法
default String get(String aa){
System.out.println("我是jdk1.8默认实现方法...");
return "";
}
//这个是静态方法
static void staticmethod(){
System.out.println("我是静态方法");
}
}
注意事项
接口默认方法、静态方法可以有多个。
默认方法通过实例调用,静态方法通过接口名调用。
default 默认方法关键字只能用在接口中。
默认方法可以被继承,如果继承了多个接口,多个接口都定义了多个同样的默认方法,实现类需要重写默认方法不然会报错。
静态方法不能被继承及覆盖,所以只被具体所在的接口调用。
十二、 标记接口
标记接口是没有任何方法和属性的接口.
它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。
标记接口作用:简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。
例如:java.awt.event 包中的 MouseListener 接口继承的 java.util.EventListener 接口定义如下:
package java.util;
public interface EventListener {
}
- 标记接口主要用于以下两种目的:
- 建立一个公共的父接口:
正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。 例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案 - 向一个类添加数据类型:
- 这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。