一、抽象类
由于继承这个显著特点,我们可以将子类设计的更加具体,而父类更加一般化,通用化。父类可以封装不同子类的共同特征或者共同行为.而有的时候,父类中封装的方法无法具体完成子类中需要的逻辑,因此我们可以将此方法设计成抽象方法,即使用关键字abstract进行修饰。而有抽象方法的类,也必须使用abstract关键字进行修饰,因此我们称之为抽象类
1、抽象方法与抽象类
- 由abstract修饰的方法为抽象方法,抽象方法只有方法名的定义,没有方法体的实现,需要使用分号结尾
- 若类中包含抽象方法,那么该类必须使用关键字abstract声明成抽象类
2、抽象类不可以实例化
- 抽象类不可以实例化,因为没有具体意义
- 抽象类中可以提供构造方法
- 抽象类中也可以没有抽象方法
- abstract和final不可以同时修饰一个类
3、继承抽象类
- 若一个类继承了抽象类,那么必须重写其抽象方法,不同的子类可以有不同的实现。
- 若继承抽象类的类也声明成抽象类,可以不用重写其抽象方法
4、抽象类的意义
- 为其子类提供一个公共的类型
- 封装子类中重复的内容,如成员变量和方法
- 定义抽象方法,子类虽然有不同的实现逻辑,但该方法的定义却是一致的。
二、接口
有的时候,我们需要从几个不相关的类中派生出一个子类,继承他们的所有成员变量和方法,但是java不支持多继承。此时,我们可以使用接口,来达到多继承的效果
1、接口的定义
- 使用interface进行定义
- 接口中只能有抽象方法和常量,
2、特点
- 提供的成员变量前,默认提供public static final进行修饰
- 提供的方法,默认使用public abtract进行修饰
- 接口不能实例化,没有任何意义
- 接口中不能存在构造器
3、实现接口
- 与继承不同,一个类可以实现多个接口。接口间使用逗号分开。
- 使用关键字implements进行实现,必须实现接口中的所有抽象方法
- 若一个类中没有全部实现接口中的抽象方法,那么该类需要使用abstract声明成抽象类
4、接口间的继承
- 接口之间可以存在继承关系,即一个接口通过关键字extends可以继承另一个接口。
- 子接口继承了父接口中的所有抽象方法
三、类与类之间的关系
类与类之间的关系,主要有以下四种关系
- 继承
- 实现
- 依赖
- 关联
1、继承
- 继承指一个类继承另一个类,或者一个接口继承另外一种接口。使用关键字extends。这样可以继承功能,也可以添加新的功能。
- 在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口
2、实现
- 实现是一个类使用关键字implements实现接口中的所有抽象方法,这种关系比较常见。
- 在UML类图设计中,实现用一条带空心三角箭头的虚线表示,从类指向实现的接口
3、依赖
- 依赖就是一个类A中的方法的参数使用到了另外一种类B。这种关系具有偶然性,临时性,关系弱。但是类B的变化会影响到A。
- 在UML类图设计中,依赖关系用由类A指向类B的带箭头虚线表示
4、关联
- 关联体现的是两个类之间的语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强,不存在关系的偶然性和临时性,一般都是长期的,而且双方的关系都是平等的。
- 关联可以单向,也可以双向。代码表现在被关联B以成员变量的方式出现在类A中
- 在UML类图设计中,关联关系用由关联类A指向被关联类B的带箭头实线表示,在关联的两端可以标注关联双方的角色和多重性标记