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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一枝独秀/51 初级黑马   /  2012-6-25 21:39  /  2527 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java里抽象类和接口的区别

10 个回复

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

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

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

另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。

接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.
回复 使用道具 举报
抽象类是类名由 abstract 修饰的,抽象类可以有 abstract 方法,也可以有非 abstract  方法,抽象方法只允许声明,不允许实现,而且不允许使用 final 和 abstract 同时修饰一个方法,下面类A中的方法min()就是 abstract 方法。
class A
{
   abstract  int  min(int x,int y);
}
抽象类不能用new运算符创建对象,但是它的非抽象子类需要重写它的全部abstract 方法,这样就可以让该抽象类声明的对象成为其子类对象的上转型对象,并调用子类的重写方法。
接口使用关键字interface来声明,接口体中包含常量定义和方法定义两部分,接口体中只进行方法的声明,不允许提供方法的实现,所以方法的定义没有方法体,例如:
interface Printable
{
    final int max=100;//成员变量必须是常量
   void add();
    flaot  sum(float x,float y);
}
因为java不支持多继承性,即一个类只能有一个父类,所以java使用了接口,一个类可以实现多个接口
回复 使用道具 举报
关于抽象类的理解呢建议你去看一下工厂设计模式的视频,
抽象类呢跟倾向于去设计整个程序的结构,
而接口肯能就是为了要满足某种功能去设计,接口就是类似于一个面,他就是为抽象类这个抽象体去服务的。
回复 使用道具 举报
下面是我总结的,希望对你有用
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
回复 使用道具 举报
1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。

2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员,所有的成员方法都是abstract的。

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

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

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

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

7.接口中的方法默认都是 public,abstract 类型的。
回复 使用道具 举报
1、Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。
如 果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个 新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。

2、一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于Java语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。
在这一点上,Java接口的优势就出来了,任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java接口,从而这个类就有了多种类型。

3、从第2点不难看出,Java接口是定义混合类型的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。

4、结合1、2点中抽象类和Java接口的各自优势,具精典的设计模式就出来了:声明类型的工作仍然由Java接口承担,但是同时给出一个Java 抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类,也就是说在层次结构中,Java 接口在最上面,然后紧跟着抽象类,哈,这下两个的最大优点都能发挥到极至了。这个模式就是“缺省适配模式”。
在Java语言API中用了这种模式,而且全都遵循一定的命名规范:Abstract +接口名。

Java接口和Java抽象类的存在就是为了用于具体类的实现和继承的,如果你准备写一个具体类去继承另一个具体类的话,那你的设计就有很大问题了。Java抽象类就是为了继承而存在的,它的抽象方法就是为了强制子类必须去实现的。

使用Java接口和抽象Java类进行变量的类型声明、参数是类型声明、方法的返还类型说明,以及数据类型的转换等。而不要用具体Java类进行变量的类型声明、参数是类型声明、方法的返还类型说明,以及数据类型的转换等。
回复 使用道具 举报
孙飞 中级黑马 2012-6-26 06:36:29
8#
接口可以简单的理解为一个特殊的抽象类,当抽象类中的方法都是抽象时,那么该类可以通过接口的形式表示。抽象类必须用abstract修饰,接口要用interface修饰。抽象类和接口都不可以实例化,抽象类可以被继承但不能多继承(extends),接口可以被多实现(implements),并且,类可以继承一个类的同时实现多个接口。并且接口降低了使用着和被使用者之间的耦合性,大大方便了代码的后期修改。
回复 使用道具 举报
本帖最后由 陆强强 于 2012-6-26 07:58 编辑

接口就是没有一般方法的抽象类,它里面的方法都是抽象方法,变量都是静态常量,且不能私有,是抽象类的最极端的形态,我们给这样的抽象类一个新的表现形式就叫接口
回复 使用道具 举报
抽象类:抽象类中有抽象方法、也可以有普通的方法和属性 如过一个类中有一个方法被定义为抽象类该类也要声明为抽象类
接口:所有的方法只是定义没有具体的实现,也就是说接口中不能有普通方法和属性 也可以说接口所圈定的范围比抽象方法还小
回复 使用道具 举报
抽象类:抽象类中有抽象方法、也可以有普通的方法和属性 如过一个类中有一个方法被定义为抽象类该类也要声明为抽象类
接口:所有的方法只是定义没有具体的实现,也就是说接口中不能有普通方法和属性 也可以说接口所圈定的范围比抽象方法还小
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马