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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lvwenwen88 黑马帝   /  2012-2-14 09:41  /  3656 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

abstract class和interface有什么区别?

评分

参与人数 1技术分 +1 收起 理由
技术测试刘老师 + 1 这个好像宝典上都有,自己学习后自答也给分.

查看全部评分

12 个回复

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

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

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

可以说interface是特殊的abstract class。

回复 使用道具 举报
同样都是不能创建对象,继承或实现接口时,必须全部覆盖抽象方法子类才能实例化

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

接口中只能定义静态的不能被修改的数据成员,所有的成员方法都是abstract的
回复 使用道具 举报
abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
回复 使用道具 举报
提示: 作者被禁止或删除 内容自动屏蔽
回复 使用道具 举报
小白 黑马帝 2012-2-14 11:10:12
8#
interface是接口,所有的方法都是抽象方法,成员变量是默认的public static final 类型。接口不能实例化自己。
abstract class是抽象类,至少包含一个抽象方法的累叫抽象类,抽象类不能被自身实例化,并用abstract关键字来修饰
回复 使用道具 举报
interface是接口,所有的方法都是抽象方法,成员变量是默认的public static final 类型。接口不能实例化自己。
abstract class是抽象类,至少包含一个抽象方法的累叫抽象类,抽象类不能被自身实例化,并用abstract关键字来修饰.
回复 使用道具 举报
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
回复 使用道具 举报
刘丁 黑马帝 2012-2-14 15:31:23
11#
相同点

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

不同点

    接口支持多继承;抽象类不能实现多继承。
    接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
    接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
    接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。
    接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法
回复 使用道具 举报
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. 如果知道某个类应该是基类,那么第一个选择的应该是让它成为一个接口,只有在必须要有方法定义和成员变量的时候,才应该选择抽象类。因为抽象类中允许存在一个或多个被具体实现的方法,只要方法没有被全部实现该类就仍是抽象类。


                           
回复 使用道具 举报
感谢各位,学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马