抽象是相对于具体而言的,具体类有直接对应的对象,而抽象类没有,一般而言是比较上层的夫类。比如说,动物是抽象,而狗是具体对象;水果是抽象,苹果是具体对象;图形是抽象,圆是具体对象。
抽象方法和抽象类
有一个图形类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 { //...其他代码 public void draw() { // .... } } |
可以这样来创建对象:
1 2 | Shape shape = new Circle(); shape.draw();//调用圆的方法。 |
为什么要抽象类
引用抽象方法和抽象类,是java提供的一种语法工具,引导使用者正确的使用它们,减少误用。
无论是写程序,还是平时做任何别的事情的时候,每个人都可能会犯错,减少错误不能只依赖人的优秀素质,还需要一些机制,使得一个普通人都容易把事情做对,而难以把事情做错。抽象类就是Java提供的这样一种机制。
抽象类和接口
抽象类和接口是配合而非替代关系,它们经常一起使用,接口声明能力,抽象类提供默认实现,实现全部或部分方法,一个接口经常有一个对应的抽象类。
比如说,在Java类库中,有:
- Collection接口和对应的AbstractCollection抽象类
- List接口和对应的AbstractList抽象类
- Map接口和对应的AbstractMap抽象类