在Java中,有许多高度抽象的基类,它们的作用在于为其派生类提供一个基础,从而使派生类更便于描述对象。这点其实不仅仅是有些编程语言会这样,我们人的语言也是这样,例如我们可以先定义一个抽象的人:直立行走的具有思想与灵魂的高级动物(本人瞎定义的)。然后我们就可以更方便的定义人的所有派生类别了,比如君子类我们可以定义为:具有优秀品质的人。但是如果我们没有定义抽象类人的话就得这样定义君子:具有优秀品质,有思想与灵魂的高级动物。如果连动物这个更抽象的类也没有那定义君子这个派生类将会更复杂,因此在上层基础的一些类我们有必要定义为抽象类。
定义:包含抽象方法的类我们叫做抽象类。抽象方法是一种被abstract修饰的没有具体实现的方法。
下面看看抽象方法是如何定义的,我们定义一个Shape抽象类
// 抽象类:被abstract修饰的类 public abstract class Shape { // 抽象方法:被abstract修饰的方法,没有方法体 abstract public void draw(); abstract void calcArea(); // 抽象类也是类,也可以增加普通方法和属性 public double getArea(){ return area; } protected double area; // 面积 } //以下是两种继承抽象类的方式,第一种必须实现所有抽象方法,第二种可以不实现但必须设置为抽象类 class A extends Demon1{ //... public void draw(){ } public void calcArea(){ } //... } abstract class B extends Demon1{ //... }
修饰类或方法的abstract和访问限定修饰符可以互换位置。抽象方法充当着占位的角色, 它们的具体实现在子类中。扩展抽象类可以有两种选择。一种是在抽象类中定义部分抽象类方法或不定义抽象类方法,这样就必须将子类也标记为抽象类;另一种是定义全部的抽象方法,这样一来,子类就不是抽象的了。
抽象类的特性-
抽象类不能直接实例化对象。不过抽象类可以定义抽象类的变量但是这个变量只能引用其非抽象子类的的对象。
-
抽象类方法不能用private修饰,默认被public修饰
-
抽象类方法不能被final和static修饰。
-
抽象类必须被继承,并且继承的子类必须重写父类的所有抽象方法,否则子类也得被abstract修饰。
-
抽象类也可以有普通方法和变量以及构造方法。
或许你会发现,如果不用抽象类,仅仅只是用普通的父子类也可以进行方法的重写,那既然这样为啥还要用抽象类呢?其实这是为了安全,多一层编译器校验。当我们用抽象类时,实际工作都是子类去完成,父类仅仅只是给子类做一个基础,也就是说用不到父类对象的,如果使用编译器就会报错。但如果仅仅只是使用普通的父子类,当使用父类是就不会报错,必须等到运行时才能发现。使用抽象类能让此类错误被尽早发现。