首先,为什么需要定义抽象类:
如上图所示,Employee和Student拥有相同的属性-姓名。所以可以将getName方法放在位于继承关系较高层次的通用超类中。但是有的Employee和Student共同属性中不方便在Persion中实现,比如要实现一个getDescription方法,需要在Employee和Student中单独实现,这时,Person可以只定义getDescription方法但什么都不做,这时就可以用abstract关键字修饰这个方法。这就是抽象类和抽象方法的用处。
一些性质:
- 包含一个或多个抽象方法的类本身必须被声明为抽象的
- 应该尽量将通用的域和方法(不管是否是抽象的)放在超类中
- 抽象方法充当着占位的角色,他们的具体实现在子类中。扩展抽象类可以有两种选择:一种是在抽象类中定义部分抽象类方法或不定义抽象类方法,这样就必须将子类也标记称为抽象类;另一种方法是定义全部的抽象方法,这样子类也就不是抽象的了。
- 类即使不含抽象方法也可以被声明为抽象类
- 抽象类不能被实例化
可以定义一个抽象类的对象变量,但是他只能引用非抽象子类的对象,如:
Person p=new Student(“ada”,“ssdfa”);
这里的p是一个抽象类Person的变量,Person引用了一个非抽象子类Student的实例。
关于是否可以省略Person中的getDescription方法而只在子类Student中定义getDescription方法,如果这样的话,就不能通过p调用getDescription方法类,因为编译器只允许调用在类中声明的方法。特别是面向接口编程的时候,这个问题特别重要。