最近在看设计模式,发现对接口和抽象类理解的并不是很透彻
希望大家不要介意,在这里随便说说,最好讲的通俗易懂

解决方案 »

  1.   

    抽象类,打个比方,水果是一个抽象类,它没有具体指那一种水果,所以抽象类不能实例化,而苹果、芒果等子类继承了水果,有共同的属性,颜色等之类的,可以实例化;
    接口可以看做一种东西的扩展吧,弥补Java不能多重继承的不足。
      

  2.   

    随便举个例子不知道恰不恰当比如说从A地到B地,人可以走过去,车可以跑过去。这个人可以是一个抽象类,可以有一些人所共有的方法,吃饭,喝水等,
    车也可以是一个抽象类,也有一些共通的方法,转向等;
    这里可以抽象一个接口出来,移动可以是一个接口,这样呢我就不用考虑到底是车跑着从A到B,还是人走着从A到B,就是物体从A移动到B  OK
    可能说的不是很明白,大家多多指教!
      

  3.   

    4#的说法有一定的正确性。J2SE中标准API很多借口都是这种样子的:  Comparable, Iterable, Cloneable, Serializable ....
    这些接口告诉我们class能干什么,确实是一种行为的抽象。关于接口与抽象类的使用,我们可以学学J2SE中集合框架的组织结构(大师写出来的东西就是不一样)。实际面向对象的设计中会出现这样的问题。很多没有什么共同点的类可能具有很多相同的行为。比如说:人类和汽车类。他们都可以move, 坏了都需要修理repair(人生病了)。但也有很多不同的行为。Java中不允许多继承,若以如果把这些行为都写进抽象类: AbstractBehavior。让class Human 和 Auto来继承,实在是一种很差劲的设计。这个时候我们可以考虑设置一些公共行为的接口:movable  repairable。让Human Auto去多实现。将很大程度上降低设计的耦合性。例子可能不是很好,一时想不到很好的。总之多琢磨一下J2SE中成功的框架(Collection, IO流)。就会有比较深刻的体会了。还有多看看设计模式。有本书不错:《Head First 设计模式(中文版)》。到处都有下的。
      

  4.   

    这玩意,面试的人最喜欢问了以上有几位高手回答的很详细,稍微补充一点点:1)
    这个不一定。一个类所有方法都是实现了的,依然可以声明为抽象的。很简单的一个例子就是,抽象类的子类实现了所有抽象方法后继续声明为抽象的。2)都说了抽象类与接口关于抽象方法的问题、但二者的成员变量没说:
       抽象类的成员变量与普通类一样,可以控制访问级别,是否静态,是否final。
       接口的成员变量都是public,static,final的3)接口可以多继承,抽象类只能单继承
    其他未尽事宜,欢迎补充
      

  5.   

    具体应用么 简单举个例子 假设 我有一个员工类 然后他的派生类有经理类和职员类 经理和职员大部分的属性和方法是相同的(如保险啊,工作时间啊等等 随意吧~) 但是他们有一个方法是不同的 那就是 工资的计算方式 前面通用的方法我们可以通过继承来实现 那么不通用的呢? 所以就给他定义了一个抽象 让他由子类去完成这个工资的计算方式LZ看看这个波
    http://hi.baidu.com/lahdc/blog/item/26e42cde7048fe50cdbf1aa5.html
      

  6.   

    我也学习和讨论下。
    抽象是is a 接口是like a
    比如mp3接口,照相接口,广播接口
    照相机 = (abstract)数码装备 implements 照相接口
    多功能手机 = (abstract)移动通讯设备 implements 照相接口 implements mp3接口 implements 广播接口
    需要照相功能时,照相机和多功能手机都可以提供这个服务。
      

  7.   

    我简单说一下没那么复杂:抽象类还是个“class”,Java中的“class”不能多继承,引入抽象类
    引入了抽象方法,这个让子类去实现,很好的实现单继承情况下的多态。但是这个解决不了现实中的一些问题
    引入了"interface",接口中除了抽象方法外,接口中的所有成员属性都是static的常量,可以通过接口直接访问,这样做的好处很明显,接口中的方法也是必须有类实现或者有接口继承,接口解决了多继承中的多态实现。
      

  8.   


    is a 和 like a不是这里的吧..
      

  9.   

    abstract class和interface的区别:
    1抽象类可以用来继承,接口只能用来实现。
    2 抽象类里面可以有实现方法,而接口里面只能有定义方法,方法的实现要在实现接口的类里面重新定义。
    3 抽象类的方法在子类中可以不实现,也可以重写父类的方法。而接口中的所用方法一定要实现,不可遗漏。
      

  10.   

    具有关键字abstract ,在实现内容上没有完全定义的类就叫抽象类。
    抽象类和接口的区别如下:
    ① 在类来继承抽象类时,只需实现部分具体方法和全部抽象方法,而实现接口则要实现里面的全部方法。
    ②在接口中无成员变量,而抽象类中可有成员变量。
    在Java中引进接口主要是为了解决多继承的问题
      

  11.   

    没记错,abstract class表示的是"is a "的关系,interface表示的是"like a "的关系
      

  12.   

    我的总结如下:接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,
    另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
    还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.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 类型的。
      

  13.   

    是我记错了 我记的关系是 is - a 和 has - a(继承与组合)特别翻书看了下
      

  14.   


    他们说的很清楚了 通用功能 但有些功能又不一样的时候可以通过继承来完成 为了保证子类会实现父类指定要求实现的方法 所以用抽象类 而接口 就是个行为规范 他只提供形式 但不提供任何实现 如List(相比下抽象类还是可以提供实现方法的) 有些时候他是个标记 如Serializable
    我不想抄书给你看 你可以自己体会 或者自己去读。。
      

  15.   

    撇开多继承 接口能做到的抽象类都可以 就像javascript定义变量就一个 var xx java非要来个int xx string xx无非就是给你个没必要的区分
      

  16.   

    个人想法
    接口
    1.定规则(在java各层制定一定的规则,实现各层的低耦合,降低维护量)
    2.多继承
    抽象类
    1.是模板的设计(相当与对一部分有共性类的综合)
      

  17.   

    我自己总结的区别。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 类型的。
      

  18.   

    abstract类可以实现接口吗??初学者试问
      

  19.   


    在这一堆话中, 只有一句有点用 :
    3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。接口,抽象类怎么用, 不需要解释, 因为编译器会告诉他该怎么用!
    需要说明的是, 什么时候用抽象类, 什么时候用接口。 为什么?
      

  20.   

    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 类型的。