子类到底继承了什么?(A)
Java的继承可以在结构和功能上为程序带来很好的便捷性和灵活性。但是在继承的过程中,如果不能够非常深刻的理解这其中的一些规律规则,就不能够很好的发挥继承带来的优势,甚至会造成一些错误。
?
继承和abstract
?
?
?
?
?
这三个类的代码如下:
?
以下段落和我的见解是一样的,分享过来:……………………………………………………………………………………………………………
In the section on Interfaces, it was noted that a class that implements an interface must implement all of the interface's methods. It is possible, however, to define a class that does not implement all of the interface methods, provided that the class is declared to be abstract. For example,
abstract class X implements Y {
// implements all but one method of Y
}
class XX extends X {
// implements the remaining method in Y
}
In this case, class X must be abstract because it does not fully implement Y, but class XX does, in fact, implement Y.
……………………………………………………………………………………………………………
来自:THE JAVA TUTORIAL:Abstract Methods and Class. URL:http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html 2 楼 thinkingmt 2012-05-09 引用一个抽象方法最终一定会得到重写,就算第一个子类将自身定义为抽象类,逃掉了重写的责任,以后也必然会有一个非抽象的子类来完成早该完成的重写任务。
其实Java这样做也不难理解:作为一个抽象类,其本身是不可以被实例化的,所以就算有某些抽象方法没有实现或重写也无碍,反正在程序运行时这些方法不会被真正地调用(就算调用,也是跑到子类去调用被实现了的重写方法了。),但是我个人觉得抽象类应该是因为自身有抽象方法才把自己定义为抽象类的,而不能因为自身继承了其他类的抽象方法,为了不去重写而将自身抽象。
相反,作为非抽象类,如果类中存在有未实现的方法的话,无论是继承而来的,还是自身定义的,都是不被允许的,因为类本身是不抽象的,如果这个类被实例化后并且调用了那些没有实现的方法,效果相当于是空,因为调用的是抽象的方法,不能做任何事情,这也是为什么非抽象类必须重写基类抽象方法的原因吧!