抽象类
什么是抽象类
抽象类是对一组事物或者说某一些对象,将他们的共同特点进行总结,定义(抽象)到一个类中,这个类叫做抽象类。简单来说:对事物进行更高层级的抽象,会形成抽象类, 这种类无法具体化。如宠物类,动物类, 食品类,交通工具类。。。。
其他有这些共同特征的类可以通过继承抽象类。
抽象方法
当类的某个操作无法具体实现时, 该操作可以定义为抽象方法。含有抽象方法的类必须定义为抽象类
特点
- 只要使用abstract修饰的类就是抽象类,抽象类可以没有抽象方法,但含有抽象方法的类必须定义为抽象类
- 子类继承抽象类,必须实现抽象类的抽象方法,否则子类也要定义为抽象类
- 抽象类不能实例化对象,抽象类的引用(变量)需要赋值子类对象或者匿名内部类对象
- 抽象类虽然不能实例化对象,但是它也有构造方法,它也可以定义实例变量,实例方法,静态变量,静态方法
接口
什么是接口
接口用来对事物的功能进行扩展。
计算机上的接口,是对计算机功能的扩展:计算机实现USB接口,扩展出鼠标、键盘功能
同理,类实现接口是对类功能的扩展
特点
- 类实现接口,扩展接口的功能,需要重写接口的方法,否则这个类需要定义为抽象类
- 接口不能实例化对象,接口的引用需要赋值实现类对象或者匿名内部类对象。通过接口引用调用方法实际执行的是实现类对象的方法(这句话对动态代理的理解有帮助),这叫做接口的多态。
- 接口中的方法默认public abstract修饰,字段默认public static final 修饰为常量,在jdk8中,接口还可以定义static 方法和default方法,这里两个方法主要用在功能的扩展
- 接口支持继承,并且支持多继承
- 一个类在继承父类的同时可以实现多个接口,需要重写接口的抽象方法
接口的应用
- 接口用来封装某个功能
- 接口可以看做是一组操作规范
- 接口在某种程度上可以解决类的多继承问题
为什么提倡面向接口编程
- 接口使用比较灵活,一个类在继承父类的同时, 可以实现多个接口
- 面向接口编程可以体现面向抽象编程思想,降低类的耦合度,提高程序的可扩展性
- 接口可以使项目分层,实现代码的可插拔
两者的区别
相同点:
- 都可以定义抽象方法
- 都不能实例化对象
不同点:
- 意义不同, 接口是功能的封装,解决对象能干什么;抽象类是事物的抽象,解决对象到底是什么;如手机,电脑可以进一步抽象为电子产品类, 电脑或者手机上有3.5mm的耳机接口.
- 内容不同:接口包含四部分(常量、抽象方法、静态方法、default方法),抽象类包含实例变量、静态变量、实例方法、静态方法、抽象方法、构造方法
- 接口支持多继承,类只允许单继承
有时候出现抽象类和接口都能解决的问题,如果仅仅是为了扩展功能,优先选择接口
类与类之间的关系
经常使用类图来描述类与类之间的关系.
类图是一咱UML图, UML(Union Modeling Language,统一建模语言)是一种图形化的建模语言, 常用的有: 用例图, 类图, 状态图, 时序图….
经常使用Rational Rose工具, Visio工具来画UML图
六个关系:继承(泛化)、实现、依赖、关联、组合、聚合
- 继承(泛化)
子类继承父类, 子接口继承父接口
- 实现
类实现了接口
- 依赖
如果在A类中使用B类定义方法返回值类型,参数类型,局部变量类型,称A类依赖B类
- 关联
如果在A类中使用B类定义了成员变量, 称A类关联B类
- 聚合
聚合是关联的一种, 在A类中包含若干的B类, 但是A类不能决定B的生命周期,称A类为聚合类
- 组合
组合是关联的一种, 在A类中包含若干的B类, 并且A类能决定B的生命周期,称A类为组合类
补充:
is a, 继承关系,也只有当 子类 is a 父类关系成立时才能使用继承
like a, 实现关系
has a, 关联关系