[size=small]上个星期去面试,老总问“抽象类和接口的区别”,整一个答不上来,知道是怎么回事,就是不能很套话的说出来。因为我去面试的是JEE的开发,其实对于JEE我刚看了点书,以前一直玩着Ruby和PHP,最近突发奇想很想要一份和java搭边的工作。
网上的说法:
区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”。
区别二,抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。
区别三,继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。
区别四,在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。
[/size]
如下给出两者的简单对比。
[size=medium][table]
||接口|抽象类|
|多继承|支持|不支持|
|类型限制|没有|有,只能是引用类型|
|方法实现|继承类型中必须给出方法实现|继承类中可以不给出|
|扩展性|比较麻烦|相对比较灵活|
|多层继承|比较麻烦,需要借助虚函数|比较灵活|
[/table][/size]
网上的说法:
区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”。
区别二,抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。
区别三,继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。
区别四,在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。
[/size]
如下给出两者的简单对比。
[size=medium][table]
||接口|抽象类|
|多继承|支持|不支持|
|类型限制|没有|有,只能是引用类型|
|方法实现|继承类型中必须给出方法实现|继承类中可以不给出|
|扩展性|比较麻烦|相对比较灵活|
|多层继承|比较麻烦,需要借助虚函数|比较灵活|
[/table][/size]