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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 成都校区 金牌黑马   /  2012-3-19 16:30  /  1826 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

接口使用的是比较多的,抽象类,貌似使用的很少,是这个情况吗,抽象类有什么用?

5 个回复

倒序浏览
抽象类和接口代表的都是抽象类型,是抽象层的具体表现。
从语法层上看抽象类可以有自己的成员变量也可以有非抽象方法,而在接口中只有不能被修改的成员变量
(必须是static final的,不过在接口中一般不定义成员变量)所有的方法都是抽象的。从某种意义上说接口是一种特殊的抽象类。
从编程角度看抽象类和接口可以实现一样的功能。带还是有区别的。抽象类是java中表示一种单个继承的关系一个类只能有一个父类。却可以实现多个接口。在抽象类的定义中可以实现部分方法其继承并不要求实现所有的抽象方法。但在接口中所有的方法只有声明。所有实现都是在子类中完成的。这会造成维护上的麻烦。(如果后来想改进接口的功能适应新的情况,就会很麻烦)如果是抽象类的话,那么只需要修改定义在抽象类中的默认行为就可以了。
从设计层看抽象类偏向于说明属性而接口说明的是功能。
比如说我有一把会报警的锁。虽然他有报警功能但本质上他还是一把锁。我就可以继承锁的抽象类。实现报警的接口。
java接口是定义混合类的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。
结合抽象类和接口的各自优势,可以得到最理想的设计实现方式:声明类型的工作仍然有java接口承担,但同时给出一个实现了这个接口的实现类,其他同属于中个抽象类的具体类可以选择实现接口,也可以选择继承整个抽象类,也就是说在层次结构中接口在最上面,紧跟着的是抽象类,这样两个抽象的功能的优点都发挥了出来。这就是"缺省适配模式",在API中就使用了这种模式。
回复 使用道具 举报
其实、他们还是各有各的用处的,一个事物的出现和存在都有着它们各自存在的理由。下面的话也许对你会有很好的帮助



一、抽象类里面的方法可以有实现,但是接口里面的方法确是只能声明。

二、接口是设计的结果
抽象类是重构的结果

三、java不支持多重继承,所以继承抽象类只能继承一个,但是可以实现多个接口。


1 接口是核心,其定义了要做的事情,包含了许多的方法,但没有定义这些方法应该如何做。
2 如果许多类实现了某个接口,那么每个都要用代码实现那些方法
3 如果某一些类的实现有共通之处,则可以抽象出来一个抽象类,让抽象类实现接口的公用的代码,而那些个性化的方法则由各个子类去实现。
所以,抽象类是为了简化接口的实现,他不仅提供了公共方法的实现,让你可以快速开发,又允许你的类完全可以自己实现所有的方法,不会出现紧耦合的问题。
应用场合很简单了
1 优先定义接口
2 如果有多个接口实现有公用的部分,则使用抽象类,然后集成它。
回复 使用道具 举报
接口:
定义接口的关键字:interface。实现接口的关键字:implements。
接口:是一些方法特征的集合。它定义的是一组功能(方法)规则。
作用:在不同事物(类)中抽象出共同功能点(方法),形成一组公开的功能规则(接口)来制约某些事物(类)的功能实现。换句话说:接口就是对类的功能(方法)抽象。
特点:
    1. 不能够被实例化
    2. 接口中的成员自动设为public
      3. 接口中不能够出现方法体的实现
    4. 接口中的属性全为静态常量
    5. 实现某个接口的类,必须实现其中所有的方法
    6. 类可以实现多个接口
    7. 接口可以继承接口

抽象类:
使用abstract定义抽象类
抽象类不能实例化
抽象类中的方法可以实现也可以不实现,可以全部实现,也可以全部不实现
抽象类只能作为父类使用
在以下情况下,某个类将成为抽象类
a) 当一个类的一个或多个方法为抽象方法时
b) 当一个类是一个抽象类的子类,并且至少有一个抽象方法没有实现时
c) 当一个类实现一个接口,并且至少有一个接口方法没有实现时。


【接口与抽象类的区别】
1、接口是公开(public)的,里面不能有私有的方法或变量,是用于让别人使用的,实现接口的一定要实现接口里定义的所有方法。
2、一个类却可以实现多个interface(java中实现多重继承的方法之一)。
3、而在接口中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),而且所有的成员方法都是抽象的。
4、interface表示的是"like-a"关系。(组合是"has a"关系)
5、接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
=========================================================================================
1、而抽象类是可以有私有方法或私有变量的,实现抽象类可以有选择地重写需要用到的方法,但是必须实现里面所有的抽象方法。
2、抽象类在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。
3、抽象类中可以有自己的数据成员,也可以有非abstarct的成员方法。
4、抽象类和接口所反映出的设计理念不同。其实abstract class表示的是"is-a"关系
5、抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
回复 使用道具 举报
        含有抽象方法的类必须是抽象类,抽象类不能被实例化,抽象类中不一定包含抽象方法,抽象类中的抽象方法必须在子类中实现,如果子类没有实现那么子类也必须是抽象类,不能有抽象构造方法和抽象静态方法
        接口是抽象类的特例,接口中的所有方法必须是 public abstract 的  接口中的成员变量必须是public static final 的
        1.抽象类可以有构造方法,接口中不能有构造方法
        2.抽象类中可以有普通成员变量,接口中没有普通成员变量
        3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的
        4.抽象类中可以包含静态方法,接口中不能包含静态方法
        5.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型
        6.一个类可以实现多个接口,但只能继承一个抽象类
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马