-----今天主要了解了抽象类,模板模式以及接口,以及他们的优缺点和写法和使用方法,下面都是其基本定义和简单描述,要学会使用首先得有基本的了解,慢慢在开始在练习中使用。
抽象类
- 面向对象编程的核心是面向抽象编程,一般依赖抽象不依赖具体
- 包含了抽象方法的类叫作“抽象类”
- 所谓的抽象方法是指没有函数体的方法,抽象方法必须在子类中给出具体实现,而抽象类本身不能创建对象
抽象类的特点
-
方法只有声明没有实现时,该方法就是抽象方法【不是空实现方法体,没有{}】,需要被abstract修饰,否则语法报错。抽象方法必须定义在抽象类中,该类必须也被abstract修饰
-
例如
—public void pp(){}不是抽象方法,只是方法的实现为空,有方法体
—public void pp(); 没有{}才是没有方法体,才是抽象方法,当然需要添加关键字abstract
不能定义抽象构造函数
- 抽象类中可以定义构造器,也可以不定义构造器,使用系统默认提供的无参构造器,但是自定义构造器不能private
- 抽象类不能是 nal class, nal类不能被继承,从语法的角度上说不允许继承,不是构造器的原
因。
不能定义抽象静态方法
- 抽象类中可以有静态方法,但是必须有方法体,不能是抽象方法
- 允许抽象类直接调用静态方法
抽象类不能直接创建对象,只能通过继承的方式由子类实现对应的抽象方法;
-
一般的使用方法为【动物 x=new 人();】
-
所有抽象类的子类必须实现抽象父类中的所有抽象方法或者自己也声明成抽象类【没有实现所有的抽象方法】
-
抽象类除了可以有抽象方法,也可以有非抽象方法,允许静态方法【没有抽象静态方法的概念】
-------没有任何限制,允许属性、方法,也允许抽象方法
抽象类不可以被实例化
- 抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化,否则这个子类还是抽象类
- 强调:注意抽象类中可以包含构造器、析构器、抽象方法和方法以及静态方法等,也可以没有抽象方法
什么时候使用抽象类
- 当一个类的一个或多个方法为抽象方法时
- 当该类为一个抽象类的子类,并且没有为所有抽象方法提供实现细节或方法主体时
- 当一个类实现一个接口,并且没有为所有抽象方法提供实现细节或方法主体时
抽象类和普通类的区别
- 抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误
- 抽象类允许(但不要求)抽象类包含抽象成员
public abstract class A{
private int age; // 可以定义属性、常量
public void pp(){}//允许定义非抽象方法,允许定义静态方法,没有抽象构造器的概念
public abstract int pp(int k); //抽象方法,抽象类中可以定义抽象方法,也可以没有抽象方法
}
- 抽象类不能被密封
- 简单说就是被 nal修饰的类,密封类不能被继承,防止了恶意的派生
模板模式
- 定义抽象类的目的是提供可由其子类共享的一般形式,子类可以根据自身需要扩展抽象类
什么是模板模式
- 在模板模式Template Pattern中一个抽象类公开定义了总体的算法【算法骨架】,把没有办法在父类中实现的方法延迟到子类中具体实现。这种类型的设计模式属于行为型模式
何时使用
- 有多个子类共有的方法,且逻辑相同
- 重要的、复杂的方法,可以考虑作为模板方法
注意事项
- 为防止恶意操作,一般模板方法都加上 final 关键词
优点
- 封装不变部分,扩展可变部分
- 提取公共代码,便于维护
- 行为由父类控制,子类实现。
缺点
- 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
分析
- 冒泡排序算法固定可以定义在父类中,但是两个比较的算法不同确定,所以可以将具体比较算法延迟到子类中实现。抽象父类中定义算法模板,具体的比较延迟到子类中进行实现
抽象类的作用
- 在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体- 实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的
- 通过从这个抽象体派生,也可扩展此模块的行为功能。为了能够实现面向对象设计的一个最核心的原则开闭原则OCP,抽象类是其中的关键所在
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象
OOP的核心是面向抽象编程
- 在父类中固化算法骨架,在子类中实现特殊的方法
- 依赖抽象
类和类之间的耦合问题
OOP要求类内高内聚、类间弱耦合—客户需求变动
接口
什么是接口
— interface
在Java中不直接支持多继承,因为会出现调用的不确定性,所以Java将多继承机制进行改良,在Java中变成了多实现。一个类可以实现多个接口,一个接口可以继承多个接口
- 可以包含抽象方法,也可以没有抽象方法
- -抽象方法必须在实现类中提供实现
- 可以使用default关键字给抽象方法提供默认实现,有默认实现的方法在实现类中可以重新定义,也可以不重新定义