黑马程序员技术交流社区

标题: 抽象类和接口 [打印本页]

作者: haixian    时间: 2014-3-28 17:52
标题: 抽象类和接口
抽象类的作用是什么,如果是面向接口编程,有接口不就够了吗?为什么要有抽象类。
作者: haixian    时间: 2014-3-28 17:57
继承体现的是isa关系,接口体现的是契约关系
作者: 630681386@qq.co    时间: 2014-3-28 18:14
接口只是一种规则和规范,和类是不一样的
作者: 1453149997    时间: 2014-3-28 18:47
抽象类属于类,它可以定义一个体系,而接口是规范、扩展功能;

它们在定义上有些类似,但是各司其职;

接口的比喻:
比如说要进入黑马,必须满足下列条件:
1.学会基础视频
2.通过入学考试
这些条件要通过接口定义,要进入黑马的人(比如他原来是环卫工人)只要实现了这个接口,就可以进入黑马,成为黑马程序员;对于黑马训练营来说,此接口就是一个黑马对想要进入黑马的人定义的规范,而对于环卫工人来说,他通过达到黑马的要求(即实现接口)扩展了自己的功能;

抽象类的比喻:
比如我们要定义人这样一个类,类里面有一个方法叫到达北京,每个人到达北京的方式可能不一样,有人坐飞机,有人坐火车,这个方法需要定义成抽象的,而具体如何达到的,由人的子类去实现,那么人和它的子类就构成了一个体系,这个体系的主框架就是由人定义的;

至于你的问题“如果是面向接口编程,有接口不就够了吗?为什么要有抽象类”,面向接口编程,用的是接口,并没有使用抽象类;
作者: 赵小豪    时间: 2014-3-28 20:05
抽象类中可有数据成员,也可有非abstarct的成员方法。 而接口只能够有静态的不能被修改的数据成员。
作者: 赵小豪    时间: 2014-3-28 20:09
接口只是一种规范,有时候接口中方法太多了,我一实现的话要写好多方法,但只有少数方法是我真正要实现的,这个时候可以选择抽象类更佳。
作者: 赵小豪    时间: 2014-3-28 20:13
接口是 final 型赋值不能更改,抽象类是 friendly 型可以重新定义可以再次赋值
作者: victorsun    时间: 2014-3-30 09:56
在Java语言中, 抽象类和接口是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。抽象类和接口之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进 行抽象类定义时对于抽象类和接口的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对 于问题领域本质的理解、对于设计意图的理解是否正确、合理。
1.在语法层面,Java语言对于抽象类和接口给出了不同的定义方式
使用抽象类的方式定义Demo抽象类的方式如下:

abstract class Demo{
abstract void method1();
abstract void method2();



  使用接口的方式定义Demo抽象类的方式如下:

interface Demo{
void method1();
void method2();

}
在抽象类方式中,Demo可以有自己的数据成员,也可以有非 abstract的成员方法,而在接口方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final 的,不过在接口中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,接口是一种特殊形式的 抽象类。
从编程的角度来看,抽象类和接口都可以用来实现 "design by contract" 的思想。但是在具体的使用上面还是有一些区别的。
  首先,抽象类 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系(因为Java不支持多继承 -- 转注)。但是,一个类却可以实现多个接口。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。
  其次,在抽象类的定义中,我们可以赋予方法的默认行为。但是在接口的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。

作者: Saner    时间: 2014-3-30 11:17
抽象类的作用通过继承它实现多态,后期绑定,可以为将来要实现的东西做好接口,实现重用性。
接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。

作者: 亓华森    时间: 2014-3-30 20:19
先说一下抽象类和接口的不同:
存在就是合理的,java语言的设计者为什么要有这两个设计呢?
从理念上来看,抽象类是对对象的抽象,具有类的特征,接口更多的是对功能的抽象。抽象类和其派生类在概念本质上是相同的。接口的实现类除了实现接口规定的“约定”和“契约”之外,可以与接口没有任何关系。
这样说吧:在实际应用中,如果对象的行为是对象的固有特征,则应使用抽象类来对其进行抽象,否则,应该使用接口来对其加以抽象。
承接二楼的说法,举个栗子:“人”是一个抽象类,但并不是每个人都有加入黑马学好java的想法,因此加入黑马就不是所有人的固有特征,因此“加入黑马”不能用抽象类来进行抽象,只能用接口对其抽象。加入黑马这一接口本质上包括一系列关于入学的规定,这就相当于前面提到的“约定”和“契约”。那这一接口的实现类只需要完成这些“约定”和“契约”,别的可以与这一接口没有关系~
作者: carpediem    时间: 2014-3-30 20:21
亓华森 发表于 2014-3-30 20:19
先说一下抽象类和接口的不同:
存在就是合理的,java语言的设计者为什么要有这两个设计呢?
从理念上来看, ...

有点意思。。。赞一个:handshake
作者: haixian    时间: 2014-3-31 07:56
1453149997 发表于 2014-3-28 18:47
抽象类属于类,它可以定义一个体系,而接口是规范、扩展功能;

它们在定义上有些类似,但是各司其职;

面向接口编程用的是只是接口吗????你确定?

作者: 蒋珍珍    时间: 2014-3-31 09:09
因为接口中的方法都默认是抽象的,都需要子类来实现,而继承中不仅包括抽象的方法,而且包括非抽象的方法,也就是说,它可以把目前很难解决或不知怎么实现,但是事物确实有这一特性功能的情况下抽象出来等待子类实现,而其他特有的方法,它可以解决,以后不会做太大的改变,就用非抽象的方法来完成,不需要子类再去写这个方法。所以我觉得这是抽象的一个好处吧,具体什么时候用抽象或是接口,这还是根据实际情况需要
作者: 1453149997    时间: 2014-3-31 14:15
haixian 发表于 2014-3-31 07:56
面向接口编程用的是只是接口吗????你确定?

以我目前的知识,我可以这么说,你可以上网查查,还有个面向对象编程;你可以找到充分的证据来否定我。

我不想让我的话引起歧义,“面向接口编程用的只是接口”意思是说,引用是接口类型的,当然我也没有必要这样强调,因为接口不能创建对象。
作者: haixian    时间: 2014-3-31 14:49
1453149997 发表于 2014-3-31 14:15
以我目前的知识,我可以这么说,你可以上网查查,还有个面向对象编程;你可以找到充分的证据来否定我。

...

我觉得面向接口中的那个接口不是指java里面的那个interface,而是指对象之间的协作关系。所以说面向接口用的不只是接口。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2