单继承与多继承对比

先举一个多重继承的例子,咱们定义一个动物(类)既是狗(父类1)也是猫(父类2),两个父类都有“叫”这个方法。那么当咱们调用“叫”这个方法时,它就不知道是狗叫仍是猫叫了,这就是多重继承的冲突。java

 

而java对此的解决方法是,一个物体的本质只能有一个。一个动物只能是狗或只能是猫,若是你想创造一个会玩毛线球的狗,那么只须要创造一个描述这类行为的接口(就叫玩耍吧),而后在本身的类里面实现“玩耍”接口,具体实现这些玩的行为,最终你一样会获得一个既像狗又像猫的动物。若是你想让这个动物叫起来像猫而不是狗,那么使用重写(override)机制,子类里从新定义“叫”这个行为便可。可是不管如何,这样获得的类是绝对不会有多重继承的冲突的。ide

再来讲说abstract class和interface的区别。blog

abstract class的核心在于,我知道一类物体的部分行为(和属性),可是不清楚另外一部分的行为(和属性),因此我不能本身实例化。仍是刚才那个例子,若是你有个abstract class叫哺乳动物,那么你能够定义他们胎生,恒定体温等共同的行为,可是具体“叫”这个行为时,你得留着让非abstract的狗和猫等等子类具体实现。继承

interface的核心在于,我只知道这个物体能干什么,具体是什么不须要听从类的继承关系。好比上述的“玩耍”interface,狗有狗的玩法,猫有猫的玩法,妖魔鬼怪机器人均可以玩耍,只要你告诉我这个物体有玩耍接口,我就能让它玩起来(๑•̀ㅂ•́) ✧接口

因此abstract class和interface是不能互相替代的,interface不能定义(它只作了声明)共同的行为,事实上它也不能定义“很是量”的变量。而abstract class只是一种分类的抽象,它不能横跨类别来描述一类行为,它使得针对“别的分类方式”的抽象变得没法实现(因此须要接口来帮忙)。而多重继承不但会形成冲突,还让一个类变得不三不四,看不出这个类的本质,因此java毅然舍弃掉了这个祸害。class


多继承:    单继承:变量

相关文章
相关标签/搜索