1、抽象类概念
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。比如:
说明:
(1)矩形、三角形、椭圆都是图形,因此和Shape类之间的关系都是继承关系
(2)虽然图形类Shape中也存在draw的方法,但由于Shape类并不是具体的图形,因此其内部的draw的方法实际是没有办法实现的。
(3)由于Shape类没有办法描述一个具体的图形,导致其draw()方法无法具体实现,一次可以将Shape类设计为“抽象类”。
在打印图形案例中,我们发现父类Shape中的draw()方法并没有什么实际工作,主要的绘制图形都是有Shape的各种子类的draw()方法来完成的,像这种没有实际工作的方法,我们可以把它设计成一个抽象方法,包含抽象方法的类我们称之为抽象类。
2、抽象类语法
在java中,一个类如果被abstract修饰,则该类被称为抽象类,抽象类中被abstract修饰的方法称为抽象方法,抽象方法不用给出具体的方法体。
代码:
注意:抽象类也是类,内部也可以包含普通方法、成员变量、构造方法
3、抽象类特性
(1)抽象类不能直接实例化对象
代码:
Shape.java
Test.java
(2)抽象方法不能被private修饰
代码如下:
(3)抽象方法不能被final和static修饰,因为抽象方法要被子类重写
代码1:
代码2:
(4)抽象类必须被继承,并且子类要重写父类中的抽象方法,否则子类也是抽象类,必须使用abstract修饰。
当我们对抽象类的子类补充写父类的抽象方法时,会报一下错误:
但是如果也让子类被abstract修饰,则不会报错:
(5)抽象类不一定包含抽象方法,但是抽象方法一定是抽象类
(6)抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量
4、抽象类的作用
抽象类本身不能被实例化,要想使用,只能创建抽象类的子类,然后让子类重写抽象类中的方法。
有人可能有疑问,普通的类也可以被继承,普通的方法也可以被重写,为什么非得用抽象类和抽象方法呢?
确实如此,但是使用抽象类相当于多了一重编译器的校验。
如何理解校验?
比如:抽象类中有抽象方法,则子类继承时,父类中的抽象方法必须被重写,否则就会报错。