今日内容:接口概述、接口定义、接口的用法、接口的继承、接口和抽象类的区别。
1.概述
接口定义了实现某种功能的规范,用来扩展类的功能。接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法
2.接口的用途
接口定义某种功能的规范,当我们编写的某些类突然有一天需要某些新增的业务和功能时,这时只需要该类接口,重写接口的抽象方法,即具备的该功能。
接口可以扩展类的功能,弥补了java类单继承的缺陷。
当我们需要为某一批类扩展新功能时,我们通常会将新功能抽取到父类当中,由子类继承,子类便具有了这些功能。但是,java是单继承,一个类只能有一个父类,如果这些类已经有一个父类了,那么久不能通过继承的方式在扩展新功能了。
这时就可以将新功能定义到接口中,子类去实现接口,重写接口定义的新功能方法,就可以扩展这些新功能了。JAVA类中,JAVA类是单继承,接口是多实现(贼重点),那么JAVA类每当需要新的功能时,只要在接口中重新定新的功能,让JAVA增加实现类即可。
那为什么给类扩展新功能,一定要把新功能定义在父接口中呢,直接写在类中不是更方便么?
1、接口就是用来定义某些功能的规范,当需要扩展新的功能时,新的功能规范定义在接口中,子类只需要实现接口,便知道重写哪些功能,增加哪些新功能了。
2、避免了子类编码的随意性。假设,如果有多个类,增加某个新功能,这个新功能如果不通过接口来规范,那么就是每个子类各自写各自的新功能,那么就可能会各个子类有 各自想法(同一个新功能在不同的子类特征不一样)。
3、通过接口定义统一规范,实现面向接口编程(通过这种方式,可以使用接口类型来接收实现类型对象(多态))。好处是:将来调用对象时,我们仅需要调用该对象的某些来自接口定义的功能时,只需要通过接口来调用即可,从而实现了程序的解耦。
接口可以解决、降低对象与对象之间的依赖(解耦)。
理解接口:
电脑上主板有n多接口,但是定义这些接口的时候,并不知道将来会是什么设备插入到这个接口上,可能是鼠标、键盘、打印机等设备,虽然不同的设备类型不一样,但是只要这些设备都对主板的接口提供了支持(实现),那么这些设备就可以插到主板上进行使用了,将来开发了新的设备,这个新的设备也只需要对主板上的接口提供实现,那么该设备也可以插到主板上进行使用。
3.接口成员
1、接口的方法都是抽象方法,默认使用public abstract 修饰,不能修改。
2、接口的变量都是静态常量,默认使用public abstract final修饰,不能修改。
3、接口中的常量必须在声明时赋值,常量名称全大写。
4.定义格式
接口关键字:interface
5.接口的用法
接口不能被创建对象,接口中的抽象方法由实现类实现。实现类使用implements实现接口,可以同时实现多个接口,使用逗号分割。
5.1 接口在多态中的体现
接口不能被创建对象,但是接口可以作为父类数据类型,接收他的实现类类型对象。
实现类实现了接口,那么该实现类的对象也是接口类型。
5.2 实现接口和继承类的问题
JAVA类具有单继承,多实现的特点。每个类只能继承一个父类对象,但是可以实现多个父接口,顺序为:先继承,在实现(贼重点)。
6.接口的多继承
接口可以同时继承一个或多个接口,使用extends继承,逗号分割。
接口继承了父接口,具有了父接口的抽象方法和静态常量。所以,当实现类实现接口的时候,同时要实现这个接口继承过来的所有抽象方法。
7.接口和抽象类的区别
7.1 接口和抽象类的相同点
1、抽象类和接口都不能被直接实例化,他们都需要被继承或实现。
(类和抽象类中间是继承关系,类和接口是实现关系,接口和接口之间可以有继承关系)
2、接口和抽象类都可以包含抽象方法,实现或继承他们的普通类必须重写抽象方法。
3、抽象类和接口,都可以体现在多态中,作为变量数据类型接收子类实例对象。
7.2 接口和抽象类的不同点
1、用途不同:
抽象类中抽取了多个子类的共性,作为模版存在,用于被子类继承实现代码复用。
接口定义了某种功能的规范,当类需要新增其他功能时,只需要实现接口,重写接口的规范(抽象方法)即可,同时接口也弥补了java单继承的缺陷。
2、接口里只能包含抽象方法,抽象类则可以包含普通方法和抽象方法。
3、接口不能定义静态方法(jdk1.8之后可以,抽象类可以)。
4、接口中的成员变量是静态常量,使用public static final修饰。抽象类则可以定义静态常量,也可以定义非静态成员变量。
5、接口不能被创建为对象,不含构造器,抽象类可以被实例化为对象,抽象类具有构造器。
抽象类是可以被实例化,子类对象创建的时候,创建抽象类父类对象。
抽象类是可以有静态代码块,构造代码块,构造器方法,抽象类就既可以有实例成员、也可以有静态成员。