一、抽象类
1.1、语法:
用abstract修饰类即为抽象类.
抽象类中可能包含抽象成员(方法,属性)这些都是共性的【可以为空,可以没有抽象成员,可以有抽象成员】
抽象类不能创建对象【不能实例化,不能New】 可以被继承!可以创建数组
定义:
调用:
1.2、语义(了解):
抽象类表示一个抽象概念(数据和行为整体).
表达概念中拥有的共性行为数据.
抽象只表示做什么,拥有什么数据,但往往不表达具体做法,不表达数据具体取值
用于做基类,统一所有子类,管理子类.
调用:
1.3 、什么时候适合用抽象类
- 》希望做基类,对多个类进行统一管理【类将再分类】
- 》使用抽象类的根本原因(也是什么时候使用抽象方法):
需求分析时找角色找共性时,找的共性中有字段;有方法,
方法中有些方法/有些行为,不同子类可能具体实现不同,父类中的这个行为就没必要实现!!
这个行为需要写成抽象的,从而这个类也要变成抽象类。
二、抽象方法
1》 定义:只有声明【定义】,没有实现的方法 就是抽象方法。
2》特点:实现类必须实现所有的抽象方法 B:A; 抽象方法必须放在抽象类中或者接口中。
但是子类也是抽象,父类的抽象方法不实现可以吗?可以。
3》 放在抽象类中的抽象方法 必须 加abstract 不能私有
实现类实现抽象方法的方法 必须加 override 不能私有
抽象方法的重写 =抽象方法的实现
抽象方法只表示做什么,但往往不表达具体做法
注意:父抽象类 抽象方法,子类 实现为虚方法 不可以
三、比较抽象方法与虚方法
下面左边基类是利用抽象方法,右边基类是用的虚方法分别计算圆、三角形、矩形的面积:
调用一样:
那什么时候用抽象方法?什么时候用虚方法呢?
上面图片的代码也是面向对象设计原则之一:里氏替换原则 (继承后的重写)
父类出现地方可以被子类替换掉,要保护替换前的原有的工作,在替换后依然保持不变子类在重写父类方法时,尽量选择扩展重写。
但是对于求面积的案例来说用抽象方法比较好,因为父类中的方法子类都没有用到。
抽象方法和虚方法区别:
从定义来说:抽象方法:只有声明【定义】,没有实现的方法 就是抽象方法;虚方法:用vritual关键修饰的已经实现的方法
语法说: 抽象方法:实现类必须实现【重写】;虚方法:可以重写也可以不重写