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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 自己玩 黑马帝   /  2012-6-28 22:36  /  2357 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 自己玩 于 2012-6-29 10:54 编辑

如题,什么时候用接口好点,什么时候用抽象类好点?谢谢!

点评

想想电脑有那些品牌,每一台电脑都有那些相同的部件,又有哪些部件不是必须的,还有哪些部件即可用于电脑上也能用在其他设备上  发表于 2012-6-29 13:27

7 个回复

倒序浏览
第一,父类如果是个抽象类,继承只能单继承,而接口可以多实现。
第二,抽象类是用于继承的,强制子类覆写其抽象方法罢了,接口是用于对程序进行拓展的。
第三,抽象类被集成后,子类被强制接受了父类原有的东西,而接口只需要复写抽象方法,没有多余的东西!
所以,当类之间有继承关系,并且子类需要父类原有的东西的时候就用抽象类。当程序需要拓展时就用接口!
回复 使用道具 举报
他们的区别:
1.   抽象类里面可以有非抽象方法..
      但接口里只能有抽象方法...接口中的所有方法都是抽像的,没有一个有程序体..
2.java中可实现多个接口,但只能实现一次继承..
选择问题:
abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替..
我的理解是这样的按着这个想应该挺简单的..
接口就把它想成一个工具,是用来用的...
抽象类就相当于..比如哈,你做了个游戏让玩家来过关,就是让玩家来实现它里边的流程...
嘿嘿根据自己的理解想出来的,有不恰当的希望指点..
回复 使用道具 举报
前两天我刚整理了一下,再贴出来吧:
接口:是一些方法特征的集合。它定义的是一组功能(方法)规则。
    作用:在不同事物(类)中抽象出共同功能点(方法),形成一组公开的功能规则(接口)
          来制约某些事物(类)的功能实现。换句话说:接口就是对类的功能(方法)抽象。
    特点:
    1. 不能够被实例化
    2. 接口中的成员自动设为public
    3. 接口中不能够出现方法体的实现
    4. 接口中的属性全为静态常量
    5. 实现某个接口的类,必须实现其中所有的方法
    6. 类可以实现多个接口
    7. 接口可以继承接口

抽象类:
使用abstract定义抽象类
抽象类不能实例化
抽象类中的方法可以实现也可以不实现,可以全部实现,也可以全部不实现
抽象类只能作为父类使用
在以下情况下,某个类将成为抽象类
a) 当一个类的一个或多个方法为抽象方法时
b) 当一个类是一个抽象类的子类,并且至少有一个抽象方法没有实现时
c) 当一个类实现一个接口,并且至少有一个接口方法没有实现时。



【接口与抽象类的区别】

1、接口是公开(public)的,里面不能有私有的方法或变量,是用于让别人使用的,实现接口的一定要实现接口里定义的所有方法。
2、一个类却可以实现多个interface(java中实现多重继承的方法之一)。
3、而在接口中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),而且所有的成员方法都是抽象的。
4、interface表示的是"like-a"关系。(组合是"has a"关系)
5、接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。


1、而抽象类是可以有私有方法或私有变量的,实现抽象类可以有选择地重写需要用到的方法,但是必须实现里面所有的抽象方法。
2、抽象类在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。
3、抽象类中可以有自己的数据成员,也可以有非abstarct的成员方法。
4、抽象类和接口所反映出的设计理念不同。其实abstract class表示的是"is-a"关系
5、抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
回复 使用道具 举报
       1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。

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

  3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。 这一点是区分什么时候用接口,什么时候用抽象类的最好判断依据。
      如:车,他的每一个子类都会拥有“轮子”这个属性,和“跑”这个方法。而且跑的方式都是一样的,就是通轮子过转动。所以这时最好把"车"定义为抽象类,这样它的子类就可以直接继承“跑”这个方法,减少代码重写。如果把“车”定义为接口,就需要在每一个子类里面定义相同的”跑“方法,显得冗余。由此可见,此时用抽象类更优。
          相反,如果子类里面的实现方法可能都不同时,使用接口就更好。当然使用接口能实现多继承,这是他最好的优点。

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

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

  6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

  7.接口中的方法默认都是 public,abstract 类型的。
回复 使用道具 举报
程序设计所面对的问题域——客观世界,是由许多事物构成的,这些事物既可以是有形的(比如一辆汽车),也可以是无形的(比如一次会议)。把客观世界中的事物映射到面向对象的程序设计中就是对象。对象是面向对象程序设计中用来描述客观事物的程序单位。客观世界中的许多对象,无论其属性还是其行为常常有许多共同性,抽象出这些对象的共同性便可以构成类。所以,类是对象的抽象和归纳,对象是类的实例。

抽象方法:仅有定义,没有具体实现的方法
抽象类:含有抽象方法的类
一个类如果被定义为抽象类,它就不能被实例化,也就是说,不能有自己的对象

声明接口使用关键字“interface”
接口中一般只包含一组public抽象方法(且必须是公有抽象方法,但方法定义中public abstract可省略),也可以包含public 静态final数据
Java不允许一个子类继承多个超类,却允许一个子类继承一个超类并实现多个接口.

给你举个例子吧。比如一个公司,有老板,老板聘的经理,还有员工,

类就是员工,抽象类就是经理,接口就是老板。



接口里就是给个方法,但是他自己不做,比如老板说我要那个文件,给我定个机票,我要那个策划方案等,都是下面人做。老板只说不做。

抽象类给的方法,有的他自己做,有的其他人做。比如经理说我要那个文档,员工就要发给他,但是他自己也要做点事,比如拿方案给老板看。经理又说又做。

一般类给的方法,就是什么都要做,都要实现。属于不说必须做的。
回复 使用道具 举报
可以参考下

抽象方法是必须实现的方法。就象动物都要呼吸。但是鱼用鳃呼吸,猪用肺呼吸。
动物类要有呼吸方法。怎么呼吸就是子类的事了。

而接口呢~还是拿教师做例子,教师的行为很多,除了和普通人相同的以外,还有职业相关的行为,比如改考卷,讲课等等,我们把这些行为定义成无body的方法,作为一个集合,它是一个interface。而教师张三李四的各自行为特点又有不同,那么他们就可以扩展自己的行为body。从这点意义上来说,interface偏重于行为。
总之,在许多情况下,接口确实可以代替抽象类,如果你不需要刻意表达属性上的继承的话。

接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,

另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
回复 使用道具 举报
抽象类:
当多个类中出现相同功能,但是功能主体不同,这时也可以进行向上抽取,这时只抽取功能定义,而不抽取功能主体。用abstract关键字标识该功能定义。抽象类和一般类没有太大的不同,还是跟以前一样描述事物,只是该事物中出现了一些不确定的部分,这些不确定的部分也是该事物的功能,需要明确出现,但是无法定义主体,通过抽象方法来表示。抽象类比一般类多了个抽象函数,就是在类中可以定义抽象方法抽象类不可能实例化。抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。
接口:
可以认为是一个特殊的抽象类,当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。子类对接口中的抽象方法全都覆盖后,子类才可以实例化。接口可以被类实现,也是对多继承不支持的转换形式。Java支持多实现。接口与接口之间可以多继承,因为都是抽象的,没有方法主体。接口的特点:接口是对外暴露的规则。接口是程序的功能扩展。接口可以用来多实现。类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口接口与接口之间可以有多继承关系

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马