A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔陈喜 中级黑马   /  2012-5-15 23:59  /  2286 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

接口和抽象类的区别在哪里啊?
他们分别在什么情况下使用。
搞不清楚什么时候使用哪一个?求明白?

7 个回复

正序浏览
抽象类和接口在定义上和功能上有很多相似的地方,具体在程序中使用抽象类还是接口需要比较抽象类和接口的具体差别。   

抽象类:一种不能实例化而必须从中继承的类,抽象类可以提供实现,也可以不提供实现   

子类只能从一个抽象类继承   

抽象类应主要用于关系密切的对象   

如果要设计大的功能单元,则使用抽象类。   

如果预计要创建组件的多个版本,则创建抽象类   


接口:是完全抽象的成员集合,不提供认识实现。   

类或者结构可以继承几个接口。   

接口最适合为不相关的类提供通用功能   

如果要设计小而简练的功能块,则使用接口   

接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口
回复 使用道具 举报
这里你提了个问题,感觉楼上的都答的差不多了,我来帮你总结并说些自己的观点吧。
第一个问题,接口和抽象类的区别。
区别一,接口中的的方法都是抽象的,但抽象类中的方法不一定都是抽象的。
区别二,抽象类是extends继承的,而接口是implements实现的。这一点很重要。要知道Java中只能单继承,但是Java中可以多实现;
            这种设计解决了不少多继承可能出现的问题,而且我认为这样更贴近现实,你想一个人只可以有一个亲生父亲但同时可以有很多叔叔。
区别三,抽象类中的方法不一定都要重写,而接口中的方法都需要重写的。

第二个问题是:实践中怎么对二者进行选择。
这觉得应该是这样,当一个类可以做到不实现并就是让别的子类来继承的话那么最好能选择接口(interface),很明显接口会给程序带来更大的扩展性,
同时可以给一个类带来实现它的同时还可以继承一个别的类,何乐而不为呢?那么如果这个类中有一个或一个以上的方法必须要实现的话那就别无选择了.
回复 使用道具 举报
黄奕豪 发表于 2012-5-16 10:10
我个人是这样理解的,接口里面全是抽象函数,是纯粹的功能定义,就是说它只是规定了一个准则,你一定得全部 ...

很形象 顶一个
回复 使用道具 举报
本帖最后由 黄奕豪 于 2012-5-16 10:11 编辑

我个人是这样理解的,接口里面全是抽象函数,是纯粹的功能定义,就是说它只是规定了一个准则,你一定得全部按照里面的准则才能实现,就像USB分接口,你一定得是USB数据线的排线位置和规格才能实现分接,而且USB转接口本身不对数据进行任何的变动!而抽象类里面不仅可以有抽象函数,还可以有自定义的函数,它不仅可以完成功能定义,还可以自己有功能实现,和USB分接口相比,就好比电脑的主板,你在两个USB口之间连设备,他也可以帮你实现转接的功能,但是它自己也可以在里面定义功能,比如你的U盘资料可以传给SATA口的硬盘,也可以对IDE接口的光驱进行刻录保存,这些都是主板自定义的功能!
回复 使用道具 举报
本帖最后由 于潇 于 2012-5-16 08:43 编辑


不要继承一个已经实现好的类,要么继承抽象类,要么实现接口,如果接口和抽象类同时可以使用的话,那么优先使用接口,避免单继承局限
回复 使用道具 举报
本帖最后由 胡团乐 于 2012-5-16 10:38 编辑

简单来说
抽象类 可以定义抽象未实现方法 和 不抽象但实现方法
abstract class AB{
abstract void show();   //抽象未实现
public void show2(){    //不抽象但实现
  System.out.println("show2().....");
}
}
而接口类 就只能定义未实现方法,让子类去实现,默认方法都是抽象的;
interface AB2{
public void show();
public void show2(); //都未实现
}
使用看需求而定 想要子类全部去实现 就定义接口比较好;而有些方法不需要子类实现,需要子类使用父类(继承)就使用抽象比较好;
回复 使用道具 举报
本帖最后由 何周舟 于 2012-5-16 02:20 编辑

接口与抽象类的异同点
        相同点
                1.都是不断向上抽取而来
                2.继承 实现后都需要将其中抽象方法复写才能被实例
        不同点
                1.接口可以被多实现 接口可以继承多个接口
                  抽象类只能被单继承
                2.接口中只能定义抽象方法 成员变量必须为静态 使其变为全局常量
                  抽象类中可以定义抽象方法还可以定义非抽象方法
                3.接口与类的关系 是 like a 像 关系 定义额外功能
                  抽象类与类的继承是 is a  是  关系 定义该类体系的基本共性内容

上面是毕导上课说的
我个人的理解是 接口是定义额外功能的 主要是用于功能的扩展
你考虑到很多东西都具有这个功能 但是都是属于不同体系的 之间没有继承关系的时候用接口
如果是一个体系 存在继承关系 只是方法功能内部的实现不同就用抽象类
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马