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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨冉 中级黑马   /  2013-3-12 23:11  /  1799 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

始终对这两个的关系很是疑惑,他们都是都是用来进行抽象类定义的,用法看起来也都差不多,那我们写代码的时候就能无所谓随便挑一个吗?若不能,请解释一下什么情况下该用哪一个呢?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 新人加油

查看全部评分

5 个回复

倒序浏览
接口的话是可以实现多重继承的功能的,它的实现是通过类来实现,也就是说它不包含方法的实现。一个类只能继承一个基类但是可以继承多个接口。抽象类的话就是表达了一种抽象的概念,就是说不存在的事物,不予具体的事物相联系,我们把它抽象话了。它主要用于多个派生类可以共享的基类的定义。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
接口与抽象类的异同点

相同点:

①.二者都包含有描述系统能提供服务的抽象方法,都不提具体实现的方法体,都不能被实例化。

②.都位于继承树的上层,都代表系统的抽象层。当系统使用继承树上的类时,
    应尽量把引用变量声明为继承树的上层抽象类型,这样可以提高两个系统的松耦合程度。

不同点:

①.抽象类中可以定义调用方法的方法体以免在子类中的重复定义,对子类中修改方法体不会造成影响;

对于接口,一旦接口公布就必须保持稳定,因为随意向接口中添加方法会直接影响到子类的功能,

此时子类要么实现新增的方法,要么就声明为抽象类,而声明为抽象类就意味着该类不能进行实例化,

也就限制了该类的应用了。

②.一个类只能有一个直接父类(此父类可以是抽象类),但它可以实现多个接口。

当子类覆盖父类的调用方法或隐藏父类的成员变量及静态方法时,Java虚拟机采用不同的绑定机制,

为了简化系统设计的复杂性和绑定机制,Java禁止多重继承;对于接口,

其内部只含有抽象方法而没有实例变量及静态方法,

即便一个类实现多个接口也不会增加绑定机制的复杂性。



接口和抽象类的使用原则

    ①使用接口作为系统与外界交互的窗口。

   ②接口必须保持稳定性。

    ③使用抽象类来定制系统中扩展点。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
这两两个知识点其实还是不同的
一、抽象类
抽象类中的方法可以是抽象的也可以是非抽象的(包含两个特殊的情况,全部是抽象方法和全部是非抽象方法)。对于抽象类中的方法全部是非抽象的情况,这是为了传宗接代-----强制让其子类继承
二、接口
接口中的方法必须全部是抽象的,并且有默认的public abstract修饰,所以要注意一点,当子类实现接口的时复写接口中的方法要注意权限的问题;接口里面的成员变量有默认的public static final 修饰,所以要注意,这些成员变量只允许读,不允许写
三、二者用法上的不同
对于java只支持单继承,为了解决这个问题java提供了多实现机制。二者用法的不同,抽象类被继承复写方法是正常的按部就班的使用,而接口是为了补充添加的作用。例如在集合框架中,TreeSet这个容器要想存储不重复的学生对象(学生对象是从人继承而来的),那么需要怎么做呢?由于学生继承人,学生没有比较的特性,但是java提供了一个接口Comparable,此接口强行对实现它的每个类的对象进行整体排序,那么只需要让学生类实现Comparable接口即可使其具有比较性(这时Comparable接口就是补充学生类的特性----使其有比较性)
四、相同点
若二者中的抽象方法不全被子类对象复写实现,那么得到的子类是抽象类。
以上拙见,希望可以帮到您!欢迎兄弟姐妹们补充

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
abstract class类中的方法不必是抽象的,就是说,一个抽象类可以不包含抽象方法。但是,包含了抽象方法的类必须是抽象的。
关于接口和抽象类的区别,楼上说的很详细了。不过我还想再理一下。
从语法上来看:
1.抽象类可以有构造方法,而接口中不能有构造方法。
2.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的
3.抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的.
4.抽象类中可以包含静态方法,接口中不能包含静态方法
5.抽象类中可以有普通成员变量,接口中没有普通成员变量
6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。  
7. 一个类可以实现多个接口,但只能继承一个抽象类。
从应用上来看:
接口多在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用

“抽象类和接口的区别在于使用动机。使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。”这句话引自 zhouyong0的专栏。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
如果仍有问题,可以继续追问;若没有问题了,请及时将帖子分类改成【已解决】~

http://bbs.itheima.com/thread-37643-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马