黑马程序员技术交流社区

标题: abstract class和interface有什么区别? [打印本页]

作者: せR3n、何必装纯    时间: 2011-11-24 17:09
标题: abstract class和interface有什么区别?
abstract class和interface有什么区别???
作者: 程佳佳    时间: 2011-11-24 17:13
抽象类是对属性,字段,方法进行封装的,而且是可以被继承来实现的,是对某个事物的公共部分一个抽象集合,
而接口是对方法的一个抽象集合。
作者: 清秋    时间: 2011-11-24 17:24
本帖最后由 清秋 于 2011-11-24 17:27 编辑

interface 支持多实现
一个类只能继承一个抽象类,但可以同时实现多个接口

比如在多线程里,多线程有两种方式:
继承Thread类
实现Runnable接口

如果你写的类需要继承其他父类,则可通过Runable接口实现多线程





作者: 常文艺    时间: 2011-11-24 17:24
1. 相同及联系
A. 两者都是抽象类,都不能实例化。
B. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。

2. 不同
A. interface需要实现,要用implements,而abstract class需要继承,要用extends。
B. 一个类可以实现多个interface,但一个类只能继承一个abstract class。
C. interface强调特定功能的实现,而abstract class强调所属关系。
D. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的(declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。这个选择有两点含义:
一是Abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子类必须实现。那些没有abstract的方法,在Abstrct class中必须定义方法体。
二是abstract class的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以通过再次声明其方法为抽象的方式,无需实现,留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。
E. abstract class是interface与Class的中介。
interface是完全抽象的,只能声明方法,而且只能声明pulic的方法,不能声明private及protected的方法,不能定义方法体,也不能声明实例变量。然而,interface却可以声明常量变量,并且在JDK中不难找出这种例子。但将常量变量放在interface中违背了其作为接口的作用而存在的宗旨,也混淆了interface与类的不同价值。如果的确需要,可以将其放在相应的abstract class或Class中。
abstract class在interface及Class中起到了承上启下的作用。一方面,abstract class是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己的实例变量,以供子类通过继承来使用。

3. interface的应用场合
A. 类与类之前需要特定的接口进行协调,而不在乎其如何实现。
B. 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。
C. 需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。
D. 需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。

4. abstract class的应用场合
一句话,在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它。最常见的有:
A. 定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用abstract class定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。
B. 某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。abstract的中介作用可以很好地满足这一点。
C. 规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特定的功能。
作者: 冯敏    时间: 2011-11-24 20:54
抽象类:声明方法的存在而不去实现,用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的,也不能创建abstract 类的实例,抽象构造函数或抽象静态方法,在子类中实现该方法时,必须实现该类所有的方法
接口:抽象类的变体,所有方法都是抽象的,没有一个有程序体的,在接口中成员变量用static final修饰,子类可以实现该接口,并重写它所有的方法。
作者: 刘元霄    时间: 2011-11-25 04:17
abstract 是抽象类, 可被继承 并且子类必须覆盖 抽象类中所有抽象方法子类才可以被创建对象。
interface 接口
子类可以继承一个父类, 并且可以 实现多个接口!
作者: wanghongye    时间: 2011-11-27 18:57
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用
于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现
该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是
一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态
方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也
是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中
实现这些方法。接口(interface)是抽象类的变体。新型多继承性可通过实现
这样的接口而获得。接口中的所有方法都是抽象的,所有成员变量都是public  
static final 的。一个类可以实现多个接口,当类实现特殊接口时,它定义(即
将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何
对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。
通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,
instanceof 运算符可以用来决定某对象的类是否实现了接口。
作者: xiaolij3s    时间: 2011-11-30 11:01
interface 支持多实现
一个类只能继承一个抽象类,但可以同时实现多个接口

比如在多线程里,多线程有两种方式:
继承Thread类
实现Runnable接口

如果你写的类需要继承其他父类,则可通过Runable接口实现多线程

补充  抽象类可以有抽象方法和非抽象方法     也可以没有抽象方法 这么做只是为了不让那个类被实例化   接口里边的全是抽象方法
作者: 冯瑞君老师    时间: 2011-12-16 10:53
抽象类
  当一个类被声明为abstract时,这个类被称为抽象类。所谓的抽象类就是没有实例对象的类。
  java中定义抽象类是出于相同考虑。抽象类是他的所有子类的公共属性的集合,所以抽象类的一大优点就是充分利用公共属性来提高开发和维护程序的效率。
2、抽象方法
  作为修饰符,abstract声明了一种没有具体对象的,出于组织概念的层次关系需要而存在的抽象类;作为类方法修饰符,abstract则声明了一种仅有方法头,而没有具体的方法体和操作实现的抽象方法。
接口是一种约束形式,其中只包括成员定义,不包含成员实现的内容。
  interface是C# 中接口操作的关键字,功能是把所需成员组合起来,以封装一定功能的集合。它好比一个模板,在其中定义了对象必须实现的成员,通过类或结构来实现它。接口不能直接实例化,即ICount ic=new iCount()是错的。接口不能包含成员的任何代码,只定义成员本身。接口成员的具体代码由实现接口的类提供。
作者: 1253431283    时间: 2011-12-23 09:55
interface是接口,所有的方法都是抽象方法,成员变量是默认的public static final 类型。接口不能实例化自己。
abstract class是抽象类,至少包含一个抽象方法的累叫抽象类,抽象类不能被自身实例化,并用abstract关键字来修饰
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用
于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现
该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是
一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态
方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也
是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中
实现这些方法。接口(interface)是抽象类的变体。新型多继承性可通过实现
这样的接口而获得。接口中的所有方法都是抽象的,所有成员变量都是public  
static final 的。一个类可以实现多个接口,当类实现特殊接口时,它定义(即
将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何
对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。
通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,
instanceof 运算符可以用来决定某对象的类是否实现了接口。




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