抽象类
2018-12-03 本文已影响13人
若兮缘
理解抽象
根据前面的示例看如下代码,我们创建一个动物父类的对象,然后调用吃东西方法,程序从语法角度来说并没有问题,但是其实每种动物都有各自的eat方法,应该实例化一个具体的动物然后完成吃东西的操作,所以这段代码是没有任何逻辑意义的。
那么有没有一种解决方案可以保证直接写出符合程序逻辑的代码,而编译时就规避这些无意义的代码。abstract关键字就可以帮助解决这个问题。使用抽象类来限制实例化。
抽象类
基本概念
在面向对象的概念中,所有的对象都是通过类来描述的,但并不是说所有的类都是用来描述对象的,当一个类中没有包含足够的信息以描绘一个具体的对象时,这样的类就是抽象类。
抽象类是用关键字abstract修饰的,抽象类中有一种特殊方法,即用abstract关键字来修饰的方法,称为抽象方法。
应用场景
当某个父类只是知道其子类应该包含怎样的方法,但无法准确知道或者说不需要准确知道这些子类如何实现这些方法时,就可以将方法定义为抽象方法,相应的类也要定义为抽象类。
例如:形状就是一个抽象的概念。不同的子类计算形状面积的方法是不一样的,可提供抽象方法来被不同的子类所实现。
特点
抽象类不允许直接实例化,也就是说抽象类不能创建对象,但是可以通过向上转型指向子类实例。
抽象方法只有声明,不能有实现,即不能包含方法体,抽象方法要求非抽象子类必须重写。
意义
- 为其子类提供一个公共的类型(模版)
- 封装子类中的重复内容(成员变量和方法)
- 将父类设置为抽象类后,既可以由父子类的继承关系限制子类的设计随意性,同时也在一定程度上避免了无意义父类的实例化
自己的理解
抽象类:可以限定父类不被实例化,避免一些无语义的代码,更重要的是在抽象类中可以定义抽象方法,而普通类则不可以。
抽象方法:在父类中有些方法在子类中的实现肯定各不相同,所以没有必要在父类中进行实现,第二也可以提醒子类必须去实现一些特定的操作。
使用规则
- 抽象类不能被实例化,即使抽象类里不包含抽象方法,这个抽象类也不能创建实例,抽象类的构造方法主要是用于被其子类调用
- 含有抽象方法的类,只能被定义为抽象类
- 抽象类中可以包含普通方法和抽象方法,也可以没有抽象方法
- 一个类继承抽象类后,必须实现其所有抽象方法,否则也要定义为抽象类
- 即使父类是具体的,但其子类也可以是抽象的,如Object是具体的,但可以创建抽象子类
- abstract修饰的方法不能同static、private一起使用,abstract也不能同final一起使用,因为final关键字使得类不可继承,不可继承使用absctract修饰该类将没有任何意义