原文链接

抽象是相对于具体而言的,具体类有直接对应的对象,而抽象类没有,一般而言是比较上层的夫类。比如说,动物是抽象,而狗是具体对象;水果是抽象,苹果是具体对象;图形是抽象,圆是具体对象。

抽象方法和抽象类

有一个图形类Shape,它有一个方法draw()。Shape其实就是一个抽象概念,它的draw方法并不知道如何实现,只有子类才知道。这种只有子类才知道如何实现的方法,一般定义为抽象方法

抽象方法是相对于具体方法而言的,具体方法有实现代码,而抽象方法只有声明,没有实现。用abstract这个关键字声明:

1
2
3
4
public abstract class Shape {
    // ... 其他代码
    public abstract void draw();
}

有抽象方法的类必须声明为抽象类,不过抽象类可以没有抽象方法。

抽象类不能创建对象。(比如 Shape shape = new Shape() )。

一个类在继承抽象类后,必须实现抽象类中定义的所有抽象方法。除非它自己也声明为抽象类。

1
2
3
4
5
6
7
public class Circle extends Shape {
    //...其他代码
    @Override
    public void draw() {
        // ....
    }
}

可以这样来创建对象:

1
2
Shape shape = new Circle();
shape.draw();//调用圆的方法。

为什么要抽象类

引用抽象方法和抽象类,是java提供的一种语法工具,引导使用者正确的使用它们,减少误用。

无论是写程序,还是平时做任何别的事情的时候,每个人都可能会犯错,减少错误不能只依赖人的优秀素质,还需要一些机制,使得一个普通人都容易把事情做对,而难以把事情做错。抽象类就是Java提供的这样一种机制。

抽象类和接口

抽象类和接口是配合而非替代关系,它们经常一起使用,接口声明能力,抽象类提供默认实现,实现全部或部分方法,一个接口经常有一个对应的抽象类。

比如说,在Java类库中,有:

  • Collection接口和对应的AbstractCollection抽象类
  • List接口和对应的AbstractList抽象类
  • Map接口和对应的AbstractMap抽象类