Java-抽象和接口
1 抽象
1.1 概述
abstract是一个修饰符,修饰的方法是抽象方法,修饰的类就是抽象类
抽象方法一定是成员方法,因为只有成员方法才能被子类覆写,而且抽象方法没有方法体
抽象类有构造方法,但是不能创建对象
注意:
抽象方法抽象的目的是抽象类不能实例化,只能用于被继承,一般抽象类中有功能的定义,但是没有功能的实现,要求必须让子类覆写
使用多态可以降低耦合度,但是父类中只需要有方法即可,不需要实现,因为每个子类的实现方式不同,子类可以选择是否要覆写,但是如果把父类定义为抽象类并且把方法定义为抽象方法,那么子类就必须得覆写该方法,这样控制权就到了父类,而不是让子类决定是否被覆写
含有抽象方法的类必须是抽象类,但是抽象类里不一定有抽象方法,比如我想让某个类不想实例化就可以定义为抽象类
final与abstract不能同时出现,因为final修饰的类不能被继承,而抽象类就是用来被继承的,final修饰的方法不能被覆写,而抽象方法就是用来被覆写的
如果一个非抽象类继承一个抽象类,必须实现抽象类中的所有抽象方法,但是如果是一个抽象类继承一个抽象类的话,可以实现0~N个抽象方法
抽象方法没有方法体(功能实现),那么肯定不能被调用,但是如果有了对象,调用与否就看调用处了,就丢失了控制权,所以抽象类不能被创建对象,抽象方法也就不能被调用了
2 接口
2.1 概述
Java接口是一些方法的声明集合,一个接口只有方法的声明没有方法的实现
接口1.8之前只能有抽象方法和常量,完全抽象
接口1.8之后也可以有静态方法和默认方法,还能有抽象方法
静态方法使用 接口名.方法名()调用即可
default方法需要使用子类实现对象调用 public default 返回值 方法名(参数列表) {}
就可以把接口中的默认方法当作类中的成员方法
接口1.9之后开始支持private方法
接口中public,static,abstract都可以省略
接口可以看作是一个特殊的类,为了解决Java中的单继承功能变弱的问题,一个类只能有一个父类,但可以有很多父接口
2.2 优点
2.3 语法
[修饰符] interface 接口名{}
接口中的常量 public,static,final可以省略
接口中的抽象方法 public,abstract可以省略
一个类可以实现多个接口,逗号隔开
接口之间是多继承,多个逗号隔开
一个类实现一个接口需要实现所有抽象方法
一个抽象类实现一个接口需要实现0~N个抽象方法
3 类关系
1 继承(泛化关系),使用关键字extends表示
class 子类 extends 父类{}
类和类之间是单继承
interface 子接口 extends 父接口1,父接口2…{}
接口和接口之间是多继承
2 实现关系,使用关键字implements表示
类和接口之间是多实现关系
class 子类 implements 父接口1,父接口2…{}
3 依赖关系
某个类的方法中的局部变量,是另外一个类对象的引用.这种关系是临时性的,方法执行完关系就不存在了
4 关联关系
某个类的成员变量是另一个类的对象引用,这种关系一般是长期的
5 聚合关系
整体和局部可以分离,各有各的生命周期,例如班级和学生,公司和员工
把多个有独立功能的小模块整合到一起完成一个新的功能,就算功能完成每个小模块还有它存在的价值
6 组合关系
组合的关系要强于聚合,也叫强聚合
整体和局部不能分离,局部没有生命周期,例如人和器官
块整合到一起完成一个新的功能,就算功能完成每个小模块还有它存在的价值