一、抽象类和抽象方法
抽象类:使用abstract修饰的类
抽象方法:在类中没有方法体的方法,称为抽象方法,抽象方法用abstract修饰
抽象类中可以没有抽象方法,包含抽象方法的类必是抽象类
如果子类没有实现父类中的全部抽象方法,子类也必是抽象类
没有抽象构造方法,抽象类不能被实例化
抽象类中可以有非抽象构造方法,创建子类的实例时可以调用
抽象类和非抽象子类间也能存在多态性
抽象类中可以有非抽象方法
抽象类可以继承,但是包含抽象方法的抽象类,在继承的时候会报错,因为类中有抽象方法,解决报错的方法有两种,第一种将子类也定义成抽象类,另一种是重写抽象类中所有的抽象方法。
抽象类不能创建对象,但是可以创建抽象类类型的对象,由子类对象赋值
如果一个方法只有存在的意义没有实现的意义,这个方法可以定义成抽象方法,包含抽象方法的类必然是一个抽象类
抽象类存在的意义就是被继承,抽象方法存在的意义就是被重写
抽象类和抽象方法就是为多态服务的,所以抽象类和非抽象之间也存在多态性
二、abstract关键字与其它修饰符
1.abstract和修饰符static不能联用,没有抽象静态方法
2.abstract和修饰符private不能联用,abstract与权限修饰符联用时没有顺序要求,abstract类中不可以有private的额成员
3.abstract和修饰符final不能联用,abstract不能与final同时修饰同一个类
static修饰方法;final修饰;private修饰
不能 重写 重写 继承
三、接口
1.接口:
概念性接口:系统对外提供的所有服务
用关键字interface定义的接口,也称为接口类型
定义接口使用的关键字是interface,类使用class修饰
接口实际上是由常量和抽象方法构成的特殊类
2.组成
静态常量
抽象方法(只有定义,没有实现)
3.定义接口
(1)一般形式
[public] interface 接口名 [extends 父接口名]
{
[pubic] [static] [final] 类型 常量字段名=值;
……
[public] [abstract] 返回类型 方法名(参数列表);
……
}
(2)接口只能用权限修饰符public和默认修饰(一种特殊的抽象类)
(3)每一个接口文件可以包含多个类和接口,但只能有一个文件名和相同的public接口
(4)接口中的常量默认用public static final修饰
(5)接口中的方法默认用public abstract修饰
4.接口的实现
[public] class 类名 [extends 祖先类名]
implements 接口名[,其它 接口名……]
{
//类的实现代码
……
}
5.接口与接口的关系
继承:接口可以继承一个或多个其它接口,并添加新的属性、方法
6.接口与类的关系:
(1)类实现接口:多个(无关)类可以实现同一接口,多个(无关)接口也可以被一个类实现(多对多的关系)
(2)与子类继承抽象类相似,当非抽象类实现接口时必须实现接口中的所有(抽象)方法,否则定义为抽象类
(3)一个类只能继承一个直接父类,但能实现一个或多个接口;
(4)类在继承其他类的同时也可以实现一个或多个接口,但要保证关键字extends在implements前使用
7.接口无构造方法,不能创建接口的实例,但可以定义接口类型的引用变量,该变量的引用是这个接口的实现类的实例
8.接口与实现类之间也存在多态性
jdk1.8之后接口中可以有非抽象的方法
一个接口文件中可以包含多个接口和多个类
可以有0个或一个由public修饰的接口
public修饰的接口的名字要跟文件的名字一样
接口与接口之间是存在继承关系的,但是是多继承关系
类和类之间存在继承关系,是单继承关系
接口和类之间没有关系,接口在前类在后
类和接口之间是实现的关系,使用implements关键字表示实现关系,而且是多实现关系,类在前接口在后
一个类可以同时继承一个类实现多个接口,但是要求继承在实现之前
类实现接口的时候需要重写接口中所有的抽象方法,否则要把该类定义成抽象类否则编译报错
接口不能创建对象
可以创建接口类型的对象,由实现类赋值
接口也可以存在多态
在继承接口的类中通常要给出接口中定义的抽象方法的具体实现
四、抽象类与接口
对比1:
类只能继承一个抽象类
类可以实现多个接口
对比2:
抽象类可以有部分方法的实现,防止子类的重复实现,介于实现与抽象间的“半成品”
接口中没有方法的实现,完全是“抽象的”
对比3:
抽象类可扩展性好:可以加入属性和非抽象方法
接口要求稳定:加入的方法都是抽象方法,(如果扩展)实现类可能会出现问题
对比4:
抽象类中的抽象方法必须加abstract关键字
抽象类中的抽象方法可以不加abstract关键字(接口中的方法都是抽象方法)
五、工厂模式
1.工厂(方法)模式:是一种创建模式,实例化同一接口(父类)的多令工厂个类
2.设计:定义创建产品对象的工厂类,由工厂类创建实现(继承)同-接口(父类)的多个类对象
3.分类:
工厂方法:一个工厂方法,通过字符串判断,创建不同类的对象
多个工厂方法:多个工广方法,通过不同方法创建不同类的对象
静态工厂方法(简单工厂方法):多个静态方法
4.何时使用:
大量需要实例的类
实现(继承)同一接口(父类)
六、适配器模式
1.适配器模式(Adapter Pattern)
也叫包装器模式(Wrapper Pattern)
定义:将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作
2.分类
类的适配器模式:用于对类进行适配 何时使用:类转换成满足另一接口时
对象的适配器模式:用于对对象进行包装 何时使用:类转换成满足另一接口时
接口的适配器模式:用于对接口抽象化 何时使用:当不希望实现一个接口的所有方法
3.三个角色
源角色(220V电源):需要适配的目标类或接口
目标角色(计算机的电源接口):期望得到的接口
适配器角色(计算机电源变压器):用于把源角色转换成目标角色
4.何时使用
系统需要使用现有的类,而这些类的接口不符合系统的需要
七、适配器模式优缺点
适配器模式的优点如下:
1.将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无需修改原有代码
2.增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性
3.灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”
4.由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强
对象适配器模式的缺点如下:
与类适配器模式相比,要想置换适配者类的方法就不容易。如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂