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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王玉玺 黑马帝   /  2011-9-21 18:37  /  3812 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

abstract class和interface有什么区别???

评分

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

查看全部评分

14 个回复

倒序浏览
黑马网友  发表于 2011-9-21 18:57:09
沙发

回复 楼主 的帖子

含有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方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码如下:[code]package com.lei;


import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public abstract class BaseServlet extends HttpServlet {

        /**
         * serialVersionUID属性概述
         *
         */
        private static final long serialVersionUID = 1L;

        public final void service(HttpServletRequest request,
                        HttpServletResponse response) throws IOException, ServletException {
                // 记录访问日志
                // 进行权限判断
                if (true)// if条件里写的是“具有权限”
                {
                        try {
                                doService(request, response);
                        } catch (IOException e) {
                                // 记录异常信息
                        }
                }

        }

        protected abstract void doService(HttpServletRequest request,
                        HttpServletResponse response) throws IOException, ServletException;
}[/code]实现类如下:[code]package com.lei;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends BaseServlet{

        /**
         * serialVersionUID属性概述
         *
         */
        private static final long serialVersionUID = 1L;

        @Override
        protected void doService(HttpServletRequest request,
                        HttpServletResponse response) throws IOException, ServletException {
                // TODO Auto-generated method stub
               
        }

}[/code]父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。
备注:这道题的思路是先从总体解释抽象类和接口的基本概念,然后再比较两者的语法细节,最后再说两者的应用区别。
比较两者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等6个方面逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功底。

转自:[url]http://www.iteye.com/topic/760018[/url]

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-21 19:17:42
藤椅
感觉这两个,完全可以组合成一个
用起来会不会方便啊!
回复 使用道具 举报
黑马网友  发表于 2011-9-21 19:24:04
板凳

回复 藤椅 的帖子

不能组合成一个,抽象类只能继承,而接口用来实现。
Java是单继承的,所以接口是很必要的。
就像上面说的抽象类可以用来实现代码的复用,所以也是很重要的。
分开来,才最好使。

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-22 07:40:20
报纸

回复 沙发 的帖子

回答的这么多,这么专业啊,学习
回复 使用道具 举报
黑马网友  发表于 2011-9-22 09:17:14
地板
抽象类是对属性,字段,方法进行封装的,而且是可以被继承来实现的,是对某个事物的公共部分一个抽象集合,
而接口是对方法的一个抽象集合。

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-22 10:28:39
7#
楼主是不是看过黑马宣传那个页面的学员日记啊?看完我觉得楼上讲的都是表面定义,比起那篇,显得很肤——
回复 使用道具 举报
黑马网友  发表于 2011-9-22 12:17:33
8#
你可以看看这篇文章,很不错
[url]http://www.blogjava.net/chunkyo/archive/2007/01/21/95093.html[/url]

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-22 12:31:58
9#

也可以这样说

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

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-22 12:52:44
10#
1、        抽象类和接口都不能实例化。
2、        抽象类可以声明抽象方法,也可以是具体的方法,还可以声明属性。接口是为了描述某些共同的行为而抽象出来的一个特殊的java类,使用interface修饰。接口解决了java单继承的限制,接口里的方法全部是抽象的:public abstract,接口里的属性必须为:public static final
3、        类是对对象的抽象,抽象类是对类的抽象,接口则是对行为的抽象。
4、        如果行为跨越了不同类的对象,可使用接口。对于一些相似的类对象,用继承抽象类。
    如: 猫、狗可以继承动物类。飞机、麻雀、超人可以实现飞的接口。
5、        从设计的角度讲,抽象类是从子类中发现公共的东西,泛化出父类,然后让子类继承。而接口不知道子类的存在,以及方法如何实现还不确定,只是预先定义。
6、        从应用上接口主要是用来定义模块之间的通信契约,是一种标准。抽象类则是在代码实现上发挥作用,实现代码的重用。比如模板模式就是抽象类使用的典型实例。假如一个系统的所有servlet都是用一种方式实现记录日志、权限判断、异常处理,那么就可以定义一个抽象的基类,让所有的servlet都继承于这个基类。又比如用传统的MVC开发一个项目时数据库的映射是一项繁琐的工作,这时候就可以用模板模式来优化一下数据的映射。

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-24 03:48:00
11#
1..interface被继承时用的关键字是implements..而且可以同时implements多个interface..而abstract class被继承时用的关键字是extends..而且只能同时extends一个abstract class.

2,,interface内定义的方法都是public的..而abstract class内的则不一定.

3..interface内定义的成员对象都是static & final的..而abstract class不是(一定不能是final)

4..interface被implements时.,所有方法都必须被实现,,必须申明是public的..而abstract class被extends时只有abstract的方法才必须被实现,,别的有默认实现的直接被继承过来

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 不错哦!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-24 11:30:59
12#

回复 楼主 的帖子

接口和abstract类的比较如下:
1、abstract类和接口都可以有abstract方法;
2、接口中只可以有常量,不可以有变量;而abstract类中既可以有常量也可以有变量。
3、abstract类中也可以有非abstract方法,接口不可以。
在设计程序时应当根据具体的分析来确定是使用抽象类还是接口。abstract类除了可以提供重要的需要子类去实现的abstract方法外,也提供了子类可以继承的变量和非abstract方法。如果某个问题需要使用继承才能更好地解决,比如,子类除了需要实现父类的abstract方法外,还需要从父类继承一些变量或继承一些重要的非abstract方法,就可以考虑用abstract类,如果某个问题不需要继承,只是需要若干个类给出某些重要的abstract方法的实现细节,就可以考虑使用接口。

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-25 11:04:52
13#
[b]楼上两位回答的已经很完整了,不过,楼主想要知道的应该是这两个是在什么场合使用吧?

接口和抽象类其实说白了就是一回事。

一般像我们做开发的时候,那时候我们约定俗成的,比如说某个东西要用到接口和抽象类,如果这个概念在你脑中确确实实中存在的那我们就使用抽象类;否则,这个概念仅仅是某个方面的特性:比如说能飞的,会跑的等等,像这类的东西我们一般把它声明成接口。

如果说,这两个概念模糊的时候。你说,我不知道设成抽象类还是接口,这个时候我们把它声明为接口,原因也很so easy,我们实现了这个接口后,还可以从其他抽象类继承。这样的话程序会比较灵活![/b]

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-28 16:09:44
14#

接口和抽象类的区别

首先接口是从抽象类中抽取出来的一种特殊的类!要了解接口 首先要明白抽象类!
抽象类说明白了就是 方法声明一样 但方法体不一样!抽象类和普通的java类的区别 在于抽象类是不能创建的对象! 抽象类可以定义抽象方法!但java普通的类不能有抽象方法!
抽象类除了抽象方法外!还可以和普通的类一样 定义属性和方法!
而接口是怎么样的呢?接口就是把抽象类中只定义抽象方法中抽取出来,成了一个很特别的抽象类
这就是接口!接口只有抽象方法!接口作用在于给每个类提供了一个可兼容而且类和类之间有关系的!
但我在别的书中看到接口中还可以定义静态变量  不知道对不对!这点我不确定

评分

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

查看全部评分

回复 使用道具 举报
i nterface是接口,abstract class是抽象类,interface里面的所有方法都是抽象的,可以说interface是一个特殊的抽象类。
抽象方法必须放在抽象类中,有抽象方法的类一定是抽象类。但是抽象类不一定有抽象方法。继承接口必须实现接口里面对所有方法。
继承抽象类不一定要实现里面的抽象方法。当子类也是抽象类的时候不用实现抽象方法。如果子类不是抽象类则要实现父类里面的抽象方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马