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

© jzxyhjl 中级黑马   /  2014-4-21 13:39  /  1769 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 jzxyhjl 于 2014-4-22 14:20 编辑

java中接口和抽象类很像,但是又有所不同,请问各位高手它们到底有什么区别啊,还有在实际应用中有什么意义呢。(一直纠结,接口和抽象类里的东西都需要重写,那直接写一个有具体方法的类多好)

11 个回复

倒序浏览
抽象类和接口的异同点:
相同点:
        都是不断向上抽取而来的。
不同点:
        1,抽象类需要被继承,而且只能单继承。
           接口需要被实现,而且可以多实现。
        2,抽象类中可以定义抽象方法和非抽象方法,子类继承后,可以直接使用非抽象方法。
           接口中只能定义抽象方法,必须由子类去实现。
        3,抽象类的继承,是is a关系,在定义该体系的基本共性内容。
           接口的实现是 like a 关系,在定义体系额外功能。
“一直纠结,接口和抽象类里的东西都需要重写,那直接写一个有具体方法的类多好”问这个问题,说明你对面向对象思想体系理解的还不是很彻底,就为了实现一个方法而去写一个类不考虑他们之间的联系,最后导致一个程序放眼望去全是类而且各个类毫无联系,如此跟面向过程没啥区别。所以要把各个类共性的东西抽象出来,通过继承实现形成一个完整的体系。

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
抽象类和接口类,一个是用来继承一个是用来实施
只要有一个抽象方法的类就可以是抽象类,除了抽象方法,抽象类可以有具体的代码等待着子类的继承和复用
而java 中继承只能单继承,所以一个类一次只能继承一个抽象类,但是一各个类可以实施多个接口

然后具体不同的应用在于策略模式:

举个鸭子类的例子,鸭子类有可能会有quack(), swim(),display()方法,然后display()设置成抽象类,因为每个鸭子的display的方法不一样,当需求改了,要所有的鸭子能飞,只需在父类duck中加入fly方法就可以了,但是如果后面的需求又变了,有些鸭子是不会飞的,我们就需要把鸭子会飞的behavior设置成一个额外的flybehavior的接口,同样quack()这个方法也有可能不能被统一,后面加进来的鸭子叫法都不同,于是我们就可以将quack()这个方法设置出来,单独设置成一个接口,被其他的鸭子去implements,这样弹性就增加了,但是我们要同时兼收继承的代码的复用性,我们可以给鸭子的flybehavior的接口写一些具体类,然后再Duck中持有flybehavior的引用,当具体的鸭子类来,用setFlybehavior将具体的对象出入就可以了

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
我在学到这里的时候也有这样的疑问,不过我在一片日志里看到了这个内容,明白了,现在给你贴过来:
1.抽象类 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。

2.在抽象类 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。

3.抽象类和interface所反映出的设计理念不同。其实抽象类表示的是"is-a"关系,interface表示的是"like-a"关系。

4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。

5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。

6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
这些就是抽象类与接口的区别,好好理解,希望对你有用

7.接口中的方法默认都是 public,abstract 类型的。

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
job 发表于 2014-4-21 14:10
抽象类和接口的异同点:
相同点:
        都是不断向上抽取而来的。

那抽象类的目的是为了把一些平铺的带有相同方法或者属性的类弄成树形的结构么?接口就是把相似的类联系起来么?
回复 使用道具 举报
张稳 发表于 2014-4-21 15:49
抽象类和接口类,一个是用来继承一个是用来实施
只要有一个抽象方法的类就可以是抽象类,除了抽象方法,抽 ...

那么如果继承其他父类的条件下,是不是说实现接口和继承抽象类都可以完成同样的目的呢?比如你的例子中,我是不是也可以分别写一个能飞的抽象类和不能飞的抽象类,来代替能飞和不能飞的接口呢?
回复 使用道具 举报
宋美成 发表于 2014-4-21 16:30
我在学到这里的时候也有这样的疑问,不过我在一片日志里看到了这个内容,明白了,现在给你贴过来:
1.抽象 ...

从结构上看,接口是特殊的抽象类,但是在应用时是不是的区别体现在哪呢。换句话说抽象类应该是在子类前写好的?而接口是在大量具有相同方法的类中抽取出来的么?
回复 使用道具 举报
抽象类应该算是普通的类和接口之间的一种中庸之道,
个人的理解就是抽象类中的抽象方法(即abstract修饰的方法)就是提供了接口的部分。抽象类并不要求所有的方法都是抽象的,也就是说抽象类之中可以允许有其子类向上抽取出来的已经实现了的方法,而接口用来建立类与类之间的协议,只提供了形式,没有任何的方法体,也就是说产生了一个完全极度抽象的类。
回复 使用道具 举报
张稳 中级黑马 2014-4-21 19:22:37
9#
jzxyhjl 发表于 2014-4-21 18:09
那么如果继承其他父类的条件下,是不是说实现接口和继承抽象类都可以完成同样的目的呢?比如你的例子中, ...

如果你有代码复用就勉强可以把,但是用接口方便
回复 使用道具 举报
张稳 发表于 2014-4-21 19:22
如果你有代码复用就勉强可以把,但是用接口方便

谢谢  似乎抓住点的什么
回复 使用道具 举报
本帖最后由 jzxyhjl 于 2014-4-22 14:20 编辑

尝试着把看到的接口内容整理了一下

接口和抽象类在结构上的区别:(引用4楼的内容)
1.抽象类 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
2.在抽象类 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
3.抽象类和interface所反映出的设计理念不同。其实抽象类表示的是"is-a"关系,interface表示的是"like-a"关系。
4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
7.接口中的方法默认都是 public,abstract 类型的。

接口和抽象类在使用上的区别:(引用http://hi.baidu.com/fuhvdovlptbghwd/item/fcdc278fe2e8ed56e63d1991)
以前对接口和抽象类,总是模糊,不知道什么时候用接口,什么时候用抽象类。
通过查阅一些资料,加上一些自己的理解,现在整理如下:

接口和抽象类有很大的相似性,甚至可以相互替换,因此很多开发者在进行开发时对于接口和抽象类的选择显得比较随意。其实,他们是有区别的。

对于接口的作用,在一些小的项目上,很难看出其发挥的优势。这就使一些经常的做小项目的开发人员,做时间久了就感觉不到它有什么好的,有时候写起来还麻烦,干脆不用了。其实,在一些大项目上,接口的作用是发挥地相当的明显的。

比如:如果你开发业务逻辑代码,当你好不容易的实现了它全部的功能,突然用户需求要改,你在修改你代码的同时,调用你代码的其它人也会改,如果代码关联性强的话,会有很多人都要改动代码,这样一来二去,程序会变得相当的不稳定,而且可能还会出现更多的新Bug,所有人都可能会陷入混乱。
但如果使用接口的话,在你使用它之前,就要想好它要实现的全部功能(接口实际上就是将功能的封装)。确定下这个接口后,如果用户需求变了,你只要重新写它的实现类,而其它人只会调用你的接口,他不管你是怎么实现的,它只需要接口提供的功能。这样,很可能只需要把你的代码修改就可以了,其他人什么都不用做。
同时:这样做的话,使得开发人员能够分工明确,只要确定下来接口了,就可以同时进行开发,提高开发效率。
另外,使用接口还有使用方便,可读性强,结构清晰等优点。

当然,我说的这些也可能是浅层面的,在其他方面还有很多的好处。

抽象类:可以有抽象方法,也可以有方法的实现。抽象类不一定有抽象方法,而有抽象方法的类一定是抽象类。抽象类不能实例化。
接口:只有方法体的声明,没有方法实现。

一个类可以实现多个接口,但只能继承一个抽象类。

在项目上,我们一般的做法是:最上层为接口,中间层次为抽象类,往下就是我们的实现类。

为什么我们会在中间加上抽象类呢,就是为了提高代码的可重用性,你可以在抽象类里提炼出一些公用的已经实现的方法,那么底下那些实现类只要继承它也就继承了这些方法。

我试着理解一下:
接口,抽象类和实现类的结构关系,和二叉树的根节点,二级节点和子节点的关系类似。
小型项目接口可以说优势甚微,而在大项目中可以很好地建立类之间的低耦合关系,而抽象类就是用于缓冲接口和实现类之间的直接联系,并且抽取实现类中的相同方法,做到代码最大化的复用,最后写道实现类时基本上就会让每个类的功能明确。

最后再次谢谢大家的回答和帮助
回复 使用道具 举报
Silvester 发表于 2014-4-21 18:29
抽象类应该算是普通的类和接口之间的一种中庸之道,
个人的理解就是抽象类中的抽象方法(即abstract修饰的 ...

也就是说接口和抽象类是用于程序结构化的,如果很小的项目或者只是简单地方法类可以不用接口和抽象类是吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马