面向对象抽象类 接口

先谈interface和class的区别,在C++里本来是没有interface,一个class可以从多个class派生。问题来了,当两个parent class都有相同方法时,调用这个class的方法会调用哪个parent class方法呢?这就是二义性问题。
Java于是禁止class的多重继承,引入了interface的概念,interface只是定义了行为特性的规约,没有实现,因此不会有二义性。
而abstract class是有一些class仅仅作为parent使用,留有一些method给出了定义(在其他method中通常会调用),但没有实现,由不同的sub class来实现。这些method被标明为abstract(就不用提供mehod body),以便sub class要么实现这些方法,要么也作为abstract class。这样的class是无法被实例化的,因此需要标明为abstract class,以便编译时刻,编译器可以提示编译错误。
没有abstract mehod和abstract class可以不可以呢?也是可以的,只要在要求sub class实现的方法中添加method body,抛出MethodNotSupportedException,如果子类没有实现这个方法,自然会在运行时刻提示异常信息。怎么避免直接实例化这个类呢?可以把这个类的构造方法改为protected。
拿interface和abstract class来比,就是前者从概念上就不允许包括method body(Java 8又在interface上引入了default method,另说),后者主要是提供实现的,只不过提炼出了一些方法推延到sub class来实现。

猜你喜欢

转载自blog.csdn.net/zeephom/article/details/79928165