抽象类
一、什么是抽象类?
在父类中,有一些子类的共同方法,但这些方法在父类中没有具体的实现,这样的方法就称为抽象方法,在方法头中使用abstract修饰符表示。包含有抽象方法的类就称为抽象类。
在UML图形记号中,抽象类和抽象方法的名字用斜体表示。
抽象类不能使用new操作符创建它的实例。抽象方法只有定义而没有实现。它的实现由子类提供。一个包含了抽象方法的类必须声明为抽象类。
抽象类的构造方法定义为protected,因为它只能被子类使用。
抽象类的几点说明:
(1)抽象方法不能包含在非抽象类中,也就是说,只要包含了抽象方法,这个类就一定要定义为抽象类。在抽象类扩展的非抽象子类中,必须实现所有的抽象方法。抽象方法是非静态的。
(2)可以定义一个不包含抽象方法的抽象类。
(3)抽象类不能使用new操作符来初始化。
(4)子类可以覆盖父类的方法并将它定义为abstract。
(5)即使子类的父类是具体的,这个子类也可以是抽象的。
(6)不能使用new操作符从一个抽象类创建一个实例,但是抽象类可以用作一种数据类型。
二、为什么要使用抽象类?
举例:
设计一个几何图形对象GeometricObject,设计一个方法比较两个几何面积是否相等。如果没有抽象方法getArea(),则无法实现equalArea()。
abstract class Geometric { public abstract double getArea() ; public boolean equalArea(Geometric o) { return (this.getArea()==o.getArea()) ; } } class Circle extends Geometric { private double radius; public Circle(double radius) { this.radius = radius; } public double getArea() { return Math.PI*radius*radius; } } class Rectangle extends Geometric { private double width,height; public Rectangle(double width,double height) { this.width = width; this.height = height; } public double getArea() { return width*height; } } public class TestAreEqual { public static void main(String[] args) { Geometric o1 = new Circle(1); Geometric o2 = new Rectangle(1,Math.PI); System.out.println(o1.equalArea(o2)); } }