抽象类从代码的样子上来看像是类和接口的中间过渡产品。它既可以包含实现了的方法,也可以包含没有实现的方法。 所有的文档都说它不能被实例化。
可是我们有没有想过它为什么不能被实例化?
我的答案是,假设它可以被实例化,那么它未被实现的方法怎么使用?
下面说下这篇文章的主题, 为什么使用抽象类?
当你想使用具有接口特性(不需要实现方法体)的普通类作为基类时。简单地说,就是你想设计一个类作为一些类的基类,但仅仅希望实现这个基类中的部分方法时。
举一个例子:
有很多品种的羊,山羊、绵羊、喜羊羊等。 。设计一个基类具有如下两个方法:
class 羊 { 吃草(); 展示羊毛特征(); }
假设各种羊的吃草动作都是一样的,那么在各种羊继承这个基类的时候就没必要再各自重写一遍这个方法的实现了。只需要在基类中一次性实现就好了。
而各种羊的样貌特征是不一样的,即使在基类中做了实现,那么在各子类中也要再次实现各自的样貌特征展示操作,所以,我们干脆就不再基类中实现这个方法了。即:
这样,基类里既有实现了的方法,又有不需要实现的方法,这个类自然就是抽象类了。这就是我所理解的使用情景。
calss 羊 { 吃草() { //some code here } 展示样貌特征(); }
另外,在实际编程中,没必要硬用抽象类或接口,该用的时候自然就用了。很赞同《代码大全》里的一句话:“一个合理的设计一定是漂亮的”,如果一个实现方法让你觉得很别扭,那一定是错的实现方法。
参考文章:
http://blog.csdn.net/b271737818/article/details/3950245
http://stackoverflow.com/questions/1913098/what-is-the-difference-between-an-interface-and-abstract-class
https://www.ibm.com/developerworks/cn/java/l-javainterface-abstract/
http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface