抽象类
相关概念:
使用关键字abstract定义的类即为抽象类。
包含一个或多个抽象方法的类,必须声明为抽象类。而且这些方法必须在其子类中实现。值得注意,抽象类中也可以存在普通的字段和方法。
扩展抽象类的两种选择:
1、在子类中保留一部分或全部的抽象方法仍未定义,这样的话子类也必须声明为抽象的。
2、在子类中实现所有的抽象方法,这样子类就不是抽象的了。
抽象类不能被实例化。
但是可以定义一个抽象类的对象变量,引用子类的对象。例如:
public abstract class Person{
...
}
public class Student extends Person{
...
}
Person p = new Student(...);
思考:抽象类存在的意义
当看到抽象类的概念时,我也会有时会觉得何必呢,但是当我们在高度抽象一类事物的时候,由于是提取的此类事物公共行为,但具体到某个具体的事物的时候,同一行为又会有不同的表现。
从别人的博客中看到一个例子,就是假如我们在写俄罗斯方块游戏时,方块是一个对象,而方块又有六种类型,所以需要扩展六个子类,但是六种方块它们的翻转方式又各有不同,比如田字型的方块,它怎么翻转都是自身的样子,而一字型的方块翻转无外乎两种情况,那么如果只在方块类中实现子类中去覆盖那么需要写的代码太多了。
能否在有一种方法可以清晰的表达方块这些对象呢。
其实,这是就可以将方块类定义为抽象类,翻转方法定义为抽象方法,不需要去实现,而是在6种方块子类中去实现各自具体的翻转方法。这样一来,既清晰的表达了每个方块的翻转方法,又减少了代码量。
如此一来,对抽象类的理解又能更加透彻一点了~