抽象类相当之重要,不会抽象类与接口,相当于没学过Java。
若在一个类中要定义一个没有方法体的方法,可以利用abstract关键字进行抽象方法定义,而包含抽象方法的类就可以使用abstract来定义为抽象类。
为什么会出现抽象类的概念?有什么作用?
类的核心组成包括属性和方法,但是学习完继承后,可知子类存在一种覆写父类方法的机制,这一机制与对象的多态性相关。但是这样会出现一个问题,假设现在使用的是普通类,类中有个print()方法。但类设计之初有个要求,希望继承它的方法一定要覆写print()方法,但是这个只是一个普通方法,子类是否覆写没有任何要求,这时候会出现一个漏洞,即父类无法强制要求子类必须覆写方法。所以需要抽象类和抽象方法来解决此类问题。
【举例】:定义抽象类
抽象方法 的特点:一个是使用abstract关键字定义,一个是方法后面没有{},即没有方法体。
【举例】:错误的使用抽象类
以上可知,抽象类不能直接进行实例化操作,因为一旦类的对象实例化了,意味着可以调用类中的方法,但是抽象类是没有方法体的。所以,在实际开发中,抽象类的使用原则:
抽象类与普通类相比,最大的好处就是强制定义了子类的实现要求,本质上讲,抽象类就是比普通类多了一些抽象方法的定义而已。实际开发设计中,父类的设计最重要,普通类相比于抽象类,抽象类的约束更加严格,所以实际开发中,几乎不会出现普通类定义子类的情况,大多数都是继承抽象类。
学到这里,整个设计结构中多了抽象类的定义,需要与原始的结构进行下对比:
1)抽象类不能使用final关键字定义,因为抽象类必须要有子类,而final不能有子类;
2)抽象类就是比普通类多了抽象方法,必须用abstract关键字声明,但是普通类中的所有结构抽象类都可以定义,包括:属性、普通方法、构造方法、常量等,且子类对象也符合对象实例化流程,默认先调用父类中的无参构造方法,再执行子类自己的构造。
【举例】:观察如下一个有意思的大坑思考题(了解即可)
3)抽象类中可以没有抽象方法,但是仍不能使用关键字new直接进行抽象类的实例化操作;
4)外部抽象类不允许使用static声明,但是内部抽象类中可以,这样表明的是一个外部抽象类;
【举例】:定义普通的内部抽象类
【举例】:在内部抽象类中使用static
5)抽象类中可以存在static方法,static方法不受实例化控制
【举例】:直接通过抽象类产生实例化对象
若发现系统类库中抽象类有直接用static方法取得实例化对象,可能就是用的以上方式。
以上出现的几种形式,有的是后面讲解系统类库中会出现的问题,目前了解即可。
抽象类与普通类具体有什么区别?打个比方,有三个物种:
现在要求实现一种命令模式,不管何种物种,只有传递指定的指令就可以进行操作。
【举例】:实现程序操作
1)行为的父类:
2)定义子类:
3)程序测试:
现在的程序中,某一类事物需要实现特定的功能,那么就必须按照Action定义的方法进行覆写,子类必须按照父类提供的模板进行代码设计,所以这种设计叫做模板设计。
1)抽象类的设计是在普通类之上的抽象,普通类描述的是具体事物,抽象类描述了多个类之间的共同点;
2)抽象类关键的问题是约定了子类必须覆写的抽象方法;
3)抽象类的使用原则:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/14063.html