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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙宇晨 中级黑马   /  2012-5-6 18:38  /  2327 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

interface 和abstract. class有什么区别?

6 个回复

倒序浏览
两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
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技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
(1)抽象类只能被单继承;接口可以被多实现,接口的出现避免了单继承的局限性。
(2)抽象类中可以有自己的成员变量;接口中的成员变量默认都是public static final类型的,且必须给初值,所以实现类中不能重新定义,也不能改变其值。
(3)抽象类中可以定义非抽象方法,直接被子类使用,也可以有抽象方法,供子类实现后使用;接口中的成员方法默认都是public abstract的,必须被子类实现后才可以被使用。
(4)抽象类中定义体系中的基本共性功能;接口中通常定义体系中对象的扩展功能。
(5)抽象类和接口所反映的设计理念不同。抽象类被继承表示的是”is a”的关系,叫做:xx是yy的一种。接口被实现表示的是”like a”的关系,叫做xx像yy中的一种。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
含有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方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
抽象类和接口,最简单的区别就是在java语法上的不同。前面的同学也都说出了这个方面。也都说的比较详细,我后面就不在重复了。但在实际的开发中却有很多微妙的关系存在。个人表示很复杂。要充分的理解这两个概念,还需要我们在平常的生活中找些实例去分析。慢慢的通过代码区了解这个过程。我想这是个刻苦学习的过程。
对于这个问题。我在网上找到了一个不错的博文。总结的比较透彻。大家可以一起学习下。(充分的利用前辈们总结出来的东西,也是让我们快速进步的一种好的方式)。
下面给出连接地址:
interface 和abstract.class的区别-------http://www.blogjava.net/chunkyo/archive/2007/01/21/95093.html
回复 使用道具 举报
抽象类通常用来表示一个类族最顶层的父类,最底层的类表示现实中具体事物,最顶层的类表示该类族所有事物的共性

因为父类不知道子类中的方法怎么实现,所以要定义成抽象的

没有方法体的方法是抽象方法

含抽象方法的类一定是抽象类
子类、父类都可以是抽象类


接口(抽象方法和常量值的集合)比抽象类更严格,不能有非抽象方法,是一种特殊的抽象类
       类不能继承接口,因此,接口只能近似地看作类
       类可以实现(implements)接口,当一个类实现了一个接口时,类能得到接口中全部成员,因此与继承相似
       多个无关的类可以实现同一个接口;一个类可以实现多个无关的接口

      类只能继承一个类,接口可以继承多个接口(多继承),即在一定程度上弥补了JAVA不能多继承的缺憾

      
抽象类:一类事物(如:交通工具Vehicle);
接口:事物的特性(如:会移动的Movable)

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

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