黑马程序员技术交流社区

标题: 抽象类与接口的区别 [打印本页]

作者: 刘丁    时间: 2012-2-8 20:12
标题: 抽象类与接口的区别
本帖最后由 刘丁 于 2012-2-9 13:09 编辑

抽象类与接口有那么多像似之处,开发中如何选择是用抽象类还是用接口呢?
作者: 余海龙    时间: 2012-2-8 20:15
一、抽象类里面的方法可以有实现,但是接口里面的方法确是只能声明。

接口是设计的结果
抽象类是重构的结果
java不支持多重继承,所以继承抽象类只能继承一个,但是可以实现多个接口。
1 接口是核心,其定义了要做的事情,包含了许多的方法,但没有定义这些方法应该如何做。
2 如果许多类实现了某个接口,那么每个都要用代码实现那些方法
3 如果某一些类的实现有共通之处,则可以抽象出来一个抽象类,让抽象类实现接口的公用的代码,而那些个性化的方法则由各个子类去实现。
所以,抽象类是为了简化接口的实现,他不仅提供了公共方法的实现,让你可以快速开发,又允许你的类完全可以自己实现所有的方法,不会出现紧耦合的问题。
应用场合很简单了
1 优先定义接口
2 如果有多个接口实现有公用的部分,则使用抽象类,然后集成它


作者: 杜明辉    时间: 2012-2-8 20:16
声明方法的存在而不去实现它的类被叫做抽像类.用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况
接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的.多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。


作者: 杜明辉    时间: 2012-2-8 20:27
接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。
作者: 最初的理想    时间: 2012-2-8 20:38
        含有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只处理的具体业务逻辑代码
                        }
       
        }
父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。       //by张孝祥老师整理
作者: 彭沛东    时间: 2012-2-8 21:20
抽象类里面可以有非抽象方法
但接口里只能有抽象方法
声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
作者: 易伟    时间: 2012-2-8 21:37
接口是更高级的抽象,抽象类是以修饰符abstract修饰的类,抽象类中的方法没有限制,可以都是已经实现的方法,
也可以有抽象方法,但有抽象方法的类一定是抽象类。所谓接口就是其中的方法都是抽象的,即只是申明方法,
没有具体方法的实现。

作者: 张青峰    时间: 2012-2-8 23:56
他们的特点总结如下:
       1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。

   2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。

   3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。

   4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。

   5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。

   6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

   7.接口中的方法默认都是 public,abstract 类型的。
      
       8.如果一个类里面有一个以上的抽象方法,则该类必须声明为抽象类。抽象方法是不可以有方法体的。

   9.抽象类中可以有非抽象方法,非抽象的方法是(也必须)有方法体的。

  10.抽象类中如果全部是抽象方法,那么抽象方法就是一个纯抽象类。


  Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个 Java接口里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。
作者: 小白    时间: 2012-2-10 18:16
抽象类必须实现所有抽象类的方法;
接口可以用于实现多态;




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