抽象类/方法的要点是为多态使用提供一个基类型。换句话说,你有一些基本类型A,其他人将扩展来提供一些操作。您不关心确切的实施,但您希望该操作可用。
一个经常被引用的例子是一个形状类:
abstract class Shape {
public abstract void draw();
}
class Circle extends Shape {
int radius;
// Constructors, etc.
@Override
public void draw() {
System.out.println("Circle of radius " + radius);
}
}
class Square extends Shape {
int side;
// Constructors, etc.
@Override
public void draw() {
System.out.println("Square of side " + radius);
}
}
类形状是指任何形状的方式。你知道不能有Shape类的实例,但是你仍然可以有一个Shape[]
或一个List<Shape>
。这样一来,你可以使用它像这样:
void drawAll(Iterable<? extends Shape> shapes) {
for (final Shape s : shapes)
s.draw();
}
如果你没有一个抽象基类Shape,你就不能写这个方法;你会写一个圆对象的列表,另一个用于广场对象的列表 - 甚至这种解决办法仍然不会允许你这样做:
List<Shape> ls = Arrays.asList(new Circle(7), new Square(5));
drawAll(ls);
是不是使用抽象类的主要好处,你不能实例化它们(如接口),但可以提供基础构造函数和扩展其他类(如类)? – mezzodrinker
我不明白你的问题:如果你有抽象方法的抽象类,你将不得不在子类中覆盖它。 – hotzst
你已经有方法在这里覆盖,因为你重写了显示方法 – Igorock