黑马程序员技术交流社区

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

作者: lvwenwen88    时间: 2012-2-14 09:41
标题: abstract class和interface有什么区别?
abstract class和interface有什么区别?
作者: 孙汇川    时间: 2012-2-14 10:09
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
作者: 彭坤    时间: 2012-2-14 10:10
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该方法的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
貌似基础视频里面毕老师已经讲得很清楚了,还是回头看视频吧,那里面还举了很多例子,比概念性的东西更容易理解
作者: 侯丽星    时间: 2012-2-14 10:14
抽象类的特点:
1.抽象方法一定在抽象类中。
2.抽象方法和抽象类必须被abstract关键字修饰。
3.抽象类不可以用new创建对象,因为调用抽象方法没意义。
4.抽象类中的方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象调用。

接口的特点:
1.接口是对外暴露的规则。
2.接口是程序的功能扩展。
3.接口可以用来多实现。
4.类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。
5.接口与接口之间可以有多继承关系。

在abstract class中,可以定义成员变量,也可以有非abstract的成员方法。抽象类和一般类没有太大的不同,它只不过比一般类多了些抽象方法。
而在interface中,只能定义常量(被public static final修饰),抽象方法(被public abstract修饰)。

可以说interface是特殊的abstract class。


作者: 杨扬    时间: 2012-2-14 10:30
同样都是不能创建对象,继承或实现接口时,必须全部覆盖抽象方法子类才能实例化

抽象类中的除了抽象方法,还能有非abstract的方法,可以有自己的数据成员;继承抽象类,必须覆盖里面所有的抽象方法,否则该类也是个抽象类

接口中只能定义静态的不能被修改的数据成员,所有的成员方法都是abstract的
作者: 成果    时间: 2012-2-14 10:32
abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

作者: 技术测试刘老师    时间: 2012-2-14 10:36
这么多同学喜欢回答简单的题目啊,哈哈~ 看来大家还是挺积极的嘛,以后谁是沙发加2分啊~`速度抢啊~`
作者: 小白    时间: 2012-2-14 11:10
interface是接口,所有的方法都是抽象方法,成员变量是默认的public static final 类型。接口不能实例化自己。
abstract class是抽象类,至少包含一个抽象方法的累叫抽象类,抽象类不能被自身实例化,并用abstract关键字来修饰
作者: 何招俊    时间: 2012-2-14 12:49
interface是接口,所有的方法都是抽象方法,成员变量是默认的public static final 类型。接口不能实例化自己。
abstract class是抽象类,至少包含一个抽象方法的累叫抽象类,抽象类不能被自身实例化,并用abstract关键字来修饰.
作者: 毛溯澜    时间: 2012-2-14 14:51
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
作者: 刘丁    时间: 2012-2-14 15:31
相同点

    都不能被直接实例化,都可以通过继承实现其抽象方法。
    都是面向抽象编程的技术基础,实现了诸多的设计模式。

不同点

    接口支持多继承;抽象类不能实现多继承。
    接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
    接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
    接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。
    接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法

作者: 靖美专    时间: 2012-2-14 16:25
1.   抽象类可以提供实现方法,接口不能提供.
            抽象类可以提供某些方法的部分实现,而java借口不可以,先核实java抽象类的唯一有点.如果想抽象类中加入一个具体的方法是,那么他所有的子类一下子都得到了这个新方法. 例如下面的抽象类添加了一个实现方法,那么子类就可以直接使用该方法了.
          public abstract  class  ClassName1
          {
                public void func1();  //添加一个实现方法
                 {
                      }
           }

            java接口做不到这一点,如果向接口加入一个新方法,所有市县该接口的类就无法编译了/ 因为,你必须让每一个类都再进一步实现这个方法才可以,这显然是java接口的缺点.    例如下面为接口添加了一个接口方法, 那么实现该接口的类必须实现该方法;
        public interface  class  ClassName2
          {
                public void func2();  //添加一个接口函数
                 {
                      }
           }
2.   抽象类只能继承一个,而可以实现多个接口.
          一个抽象类的实现只能由这个抽象类的子类给出,也就是说这个实现类处在抽象类所定义出来的继承等级结构中,,因为java语言的单继承特性,所以它作为类型定义工具的功能大打折扣...
         java接口,任何一个实现了接口所规定的方法的类都可以具有这个接口的类型,...一个类可以实现任意多个接口,从而这个类有了多种类型..
       由此,最经典的设计模式出现了,声明类型的工作仍然由java接口承担,但同时给出一个java抽象类,且实现这个接口,其他同属于这个抽象类的具体类可以实现这个java接口, 也可以选择继承这个抽象类.....也就是说,,java接口在嘴上敏,然后紧跟着抽象类,将两个优点发挥极致,,这种模式称为"默认适配模式".
         实现代码如下:
                  //定义顶层接口
          public interface  class  ClassName1   
           {
                        public void func1();  //定义一个接口方法
           }

                                //定义实现抽象类
                 public abstract  class  ClassName2
                  {
                      public void func2() //定义一个实现方法
                 {
                            }
                 }
                //定义实现类
             public   ClassName3    extends  class  ClassName2   implements  ClassName1   
                  {     
                            public void func1()  //实现接口函数
                             {
                                  func2(); //调用抽象类函数
                            }
                  }

       这里先定义了一个接口类class  ClassName1    ,为它添加了一个接口函数func1()   ,然后定义了一个抽象类class  ClassName2, 添加了了自己的实现函数 func2() ,最后定义了具体类ClassName3  ,既继承了抽象类class  ClassName2   ,又实现了接口class  ClassName1 ,这样他就拥有了接口函数 func1()   和实现函数func2()  .
          接口在某些地方和抽象类有相似的地方,但采用哪种方式来声明主要参照以下两点.
            1. 如果要创建不带任何方法定义和成员变量的基类,那么就应该选择接口而不是抽象类。  
      2. 如果知道某个类应该是基类,那么第一个选择的应该是让它成为一个接口,只有在必须要有方法定义和成员变量的时候,才应该选择抽象类。因为抽象类中允许存在一个或多个被具体实现的方法,只要方法没有被全部实现该类就仍是抽象类。


                           
作者: lvwenwen88    时间: 2013-1-27 14:29
感谢各位,学习了




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