关于抽象类,首先由以下几点说明,然后我们根据例子来理解这些说明:
①用abstract修饰一个类时,该类是抽象类;用abstract修饰一个方法时,该方法是抽象方法。
②含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写。
③抽象类不能被实例化
④抽象方法只需要声明,不需要实现。
对于上面的类Animal,可以看到他的所有子类Cat和Dog都重写了父类Animal的enjoy方法也就是说,也许,我们在父类中实现enjoy方法是没有什么意义的,反正子类总是要重写它的。这时候,为了简单,我们就可以只在父类中声明而不实现enjoy方法,由他的子类去实现enjoy方法。也就是,我们可以在父类中声明抽象的方法enjoy,根据第②条,含有抽象方法的抽象类也必须声明为抽象类。那么Animal就变成了如下的形式:
abstract class Animal{private String name;
Animal(String name){
this.name=name;
}
public abstract void enjoy();
}
而其他代码不需要做任何改变。
需要注意的是,即使Cat继承于抽象父类Animal,但是Cat可以选择依旧不去实现父类中的抽象方法enjoy,而是将Cat改成如下形式:
也就是说Cat不去实现enjoy,而是声明了enjoy为抽象方法,同时也把自己变成了抽象方法,事实上,Cat甚至可以不用声明enjoy这个抽象方法(即省掉第15句),只把自己声明为抽象类,这也是可以的。但是Cat的某个子类如过不是把自己声明为了抽象类,那么它就必须实现enjoy方法。
至于对第③条的理解,我们可以把抽象的类看做是一个残缺的类,因为他的某些方法没有实现,他并不知道在子类中这些抽象方法是如何实现的,所以具有不确定性,不能实例化抽象类。