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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Akm 黑马帝   /  2012-2-27 20:05  /  3017 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

接口与抽象类的区别?

8 个回复

倒序浏览
interf与abstract里面都可以定义抽象方法,但是interface里面只可以定义抽象方法,abstract里面除了定义抽象方法以外,还可以定义一般的方法即有方法体的方法,interface可以说是比abstract更抽象,里面只可以定义抽象方法。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
接口中的方法全是抽象方法。 全部在子类中实现 。 抽象方法中可以是 普通方法和抽象方法 。若一个类中有抽象方法这个类必须是抽象类 抽象方法 必须在子类实现
回复 使用道具 举报
抽象类不能继承接口                   接口可以继承接口
抽象类中可以有不抽象的方法           接口中所有的方法都是抽象的
抽象类用abstract class定义             接口用interface定义
抽象类用extend继承                  接口用implements实现
抽象类中的方法没有默认的修饰符       接口中的方法默认被 abstract public修饰
抽象类中的成员变量没有默认的修饰符   接口中的成员变量默认被public static final 修饰
一个类只能继承一个抽象类             一个类可以实现多个接口

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
这种基础的问题,看了忘,忘了看。从网上找到的千篇一律。今天再复习一下这些说法。
抽象类和接口的区别:
      1.类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做。。。”.抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中.
      2.接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;     
       3.一个类一次可以实现若干个接口,但是只能扩展一个父类
      4.接口可以用于支持回调,而继承并不具备这个特点.
      5.抽象类不能被密封。
      6.抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的.
      7.(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。   
       8.抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的座位子类去实现。
      9.好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。
     10.尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!后果可想而知.(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。比如asp.net中,Page类,有Server Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则。
    11.如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法.


第一条:简单点说就是抽象类是对类的抽象,接口是一个行为的规范,其他的就太XX了看不懂。

第二条:可以理解为继承接口只是为了使用接口中的方法

第三条:类可以继承自多个接口,只能继承一个类,接口也可以继承自多个接口啊,区别就是接口能不能继承自类了,写一个接口让他继承一个类。
回复 使用道具 举报
陈斌 中级黑马 2012-2-29 22:56:03
7#
  抽象类和接口都包含可以由派生类继承的成员,他们都不能实例化,但可以声明它们的变量。如果这样做,就可以使用多态性把继承这两种类型的对象指定给它们的变量。接着听过这些变量来使用这些类型的成员,但不能直接访问派生类的其它成员。
    抽象类和接口的区别主要有以下区别:
□它们的派生类只能继承一个类,即只能继承一个基类,即只能直接继承一个抽象类,但可以继承多个接口。
□抽象类中可以定义成员的实现,但接口中不可以。
□抽象类中可以包含字段、构造函数、析构函数、静态成员和常量等,但接口不行。
□抽象类中成员可以是私有的(只要它不适抽象的)、受保护的、内部的、受保护和内部的,但接口成员必须是公共的。
□抽象类和接口这两种类型用于完全不同的目的。抽象类主要用作对象系列的基类,共享某些主要特性,例如共同的目的和结构。接口则主要用于类,这些类在基础水平上有所不同,但仍可以完成某些相同的任务。
回复 使用道具 举报
        含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
        接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
        下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
        2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
        4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
        eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
        下面接着再说说两者在应用上的区别:
        接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码如下:
        public abstract class BaseServlet extends HttpServlet
        {
                        public final void service(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException
                        {
                                记录访问日志
                                进行权限判断
        if(具有权限)
        {
                try
                {
                        doService(request,response);
        }
                catch(Excetpion e)
                {
                                记录异常信息
                }
        }
                        }
                        protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException;  
        //注意访问权限定义成protected,显得既专业,又严谨,因为它是专门给子类用的
        }
       
        public class MyServlet1 extends BaseServlet
        {
        protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException
                        {
                                本Servlet只处理的具体业务逻辑代码
                        }
       
        }
父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。
回复 使用道具 举报
LZ的观点很不错哦~~

顶顶更健康

曹氏提琴
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马