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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张开开 黑马帝   /  2012-2-21 10:46  /  3307 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

abstract class和interface有什么区别? 请说得详细些,看了一些人的回答,还是不太明白,拜托啦!@!

10 个回复

倒序浏览
最主要的区别:
interface  所有方法都抽象,相当于定义了一种规范
abstract class 可以有部分方法不抽象,若是所有方法都抽象,则定义成interface
回复 使用道具 举报
两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
回复 使用道具 举报
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
回复 使用道具 举报
楼上的都说得很好
回复 使用道具 举报
区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成。
区别二,抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。
区别三,继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。
区别四,在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。
回复 使用道具 举报
王康 黑马帝 2012-2-21 11:28:33
7#
1  接口概念

接口主要作用是可以帮助实现类似于类的多重继承的功能。在Java中,出于简化程序结构的考虑,不再支持类间的多重继承而只支持单重继承,即一个类至多只能有一个直接父类。然而在解决实际问题的过程中,仅仅依靠单重继承在很多情况下都不能将问题的复杂性表述完整,需要其他的机制作为辅助。

2  接口声明

Java中声明接口的语法如下:

[public]  interface  接口名  [extends  父接口名列表]

{  //接口体;

   [public]  [static]  [final]  域类型  域名=常量值;        //常量域声明

   [public]  [abstract] 返回值  方法名(参数列表) [throw异常列表];        //抽象方法声明

}

定义接口与定义类非常相似,接口是由常量和抽象方法组成的特殊类

(1)接口中的属性都是用 final修饰的常量,

(2)接口中的方法都是用abstract修饰的抽象方法,在接口中只能给出这些抽象方法的方法名、返回值和参数列表,而不能定义方法体,即仅仅规定了一组信息交换、传输和处理的“接口”

2  接口的实现

实现接口步骤:

(1)在类的声明部分,用implements关键字声明该类将要实现哪些接口;
如下:
class 类名 implements 接口{

}
(2)如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法,即为所有抽象方法定义方法体,而且方法头部分应该与接口中的定义完全一致,即有完全相同的返回值和参数列表;

(3)如果实现某接口的类是abstract的抽象类,则它可以不实现该接口所有的方法。

(4)一个类在实现某接口的抽象方法时,必须使用完全相同的方法头。

(5)接口的抽象方法,其访问限制符都已指定是public,所以类在实现方法时,必须显式地使用public修饰符。

一个接口的定义由关键字interface开始以包含pubic final static数据。但这不是必须的,即子类也可以使用一个方并包含一套public abstract方法,接口也可为使用接口,一个类必须声明实现(关键字implements)接口,指定的参数个数和返回类型定义每个方法。当没有缺省的实现用来继承时,通常使用接口而不使用抽象类。

当某个类实现一个接口时,也有同样的“是一个”继承性关系。并且必须根据接口中为实现一个以上的接口,只要在类定义中的关键字implements后面列出接口名逗号分隔。
回复 使用道具 举报
王涛 黑马帝 2012-2-21 12:05:06
8#
在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
interface是接口,所有的方法都是抽象方法,成员变量是默认的public static final 类型。接口不能实例化自己。
abstract class是抽象类,至少包含一个抽象方法的累叫抽象类,抽象类不能被自身实例化,并用abstract关键字来修饰
abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。
在abstract class方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的abstract class。
回复 使用道具 举报
袁野 黑马帝 2012-2-21 13:20:26
9#
接口中的方法 必须全部在子类中实现,抽象类 可以有抽象方法也可以有普通方法  。子类只要实现抽象累就可以了
回复 使用道具 举报
抽象类是对一类事物的行为的抽象,而接口是更进一步的抽象
比如:形容人在长安街上走路
抽象类会这样说:人在马路上走
而接口会这样说:人在走路
接口相对于抽象类来说连马路都省了,人有可能在屋顶上走,也有可能在水面上走
所以说接口是更进一步的抽象

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
一个是继承父类,一个是实现子类,extends implements
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马