问题:接口是由抽象方法和类常量构成,抽象类又可以含有抽象方法,抽象方法有方法体,这样传递来说,也就是接口也可以有方法体,可是,为什么书上说,接口中不允许有方法体呢??
困惑,求解??谢谢

解决方案 »

  1.   


    1、 接口用于多重继承,也不能实例化。
        接口中只有方法的声明,也就是抽象方法,是没有方法体的。
        接口中可以有静态常量(static final)定义 ;    抽象方法是没有方法体的 ;2、抽象类用于单一继承的,不能实例化。
       抽象类中可以有 属性 、方法、抽象方法 ;3、抽象类-->"is a"关系,抽象出共同的本质特征,单一继承;
       接口-->"like a"关系,个性化特征,多重继承。
      

  2.   

    lz说的是"可是,为什么书上说,接口中不允许有方法体呢??",书上说的是对的,
    然后
    lz",这样传递来说,也就是接口也可以有方法体,"
    怎么能走传递路线呢lz?
      

  3.   

    抽象类:
     含有abstract修饰符的class即为抽象类; 抽象方法和抽象类规则:
      1.抽象类必须使用abstract修饰符来修饰,抽象方法也必须用abstract来修饰,抽象方法不能有方法体.
      2.抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例.
      3.抽象类可以包含属性、方法、构造器、初始化块、内部类、枚举类六种成分.抽象类的构造器不能用于创建实例,主要是被子类调用
      4.含有抽象方法的类只能被定义成抽象类.3种情况:
       a.直接定义了一个抽象方法
       b.继承了一个抽象父类,但没有完全实现父类包含的抽象方法
       c.实现了一个接口,但没完全实现接口包含的抽象方法 *当abstract修饰类时,表明这个类只能被继承,当abstract修饰方法时,表明这个方法必须由子类提供实现(重写).而final修饰的类不能被继承,final修饰的方法不能被重写,因此final和abstract永远不能同时使用. *当使用static修饰一个方法时,表明这个方法属于当前类,即该方法可以通过该类来调用,如果该方法被定义成抽象方法,则将导致通过该类来调用该方法时出错(没有方法体),因此static和abstract不能同时修饰某个方法. *abstract关键字修饰的方法必须被其子类重写才有意义,否则这个方法将永远不会有方法体,因此abstract方法不能定义为private访问权限,即private和abstract不能同时使用. 抽象类不能创建实例,它只能当成父类来被继承.从语义的角度来看,抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象.从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类设计的随意性. 抽象类体现的是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会大致保留抽象类的行为方式. 如果编写了一个父类,父类提供了多个子类的通用方法,并把一个或多个方法留给子类实现,这就是一种模板模式.简单规则:
      1.抽象父类可以只定义需要使用的某些方法,其余则留给子类实现.
      2.父类中可能包含需要调用的其他系列的方法,这些被方法既可以由父类实现,也可以由其子类实现.父类里提供的方法只是定义了一个通用算法,其实现也许并不完全由自身实现,而必须依赖于其子类的辅助.接口:
     抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更彻底,则可以提炼出一种更加特殊的"抽象类"---接口(interface),接口里不能包含普通方法,接口里所有方法都是抽象方法. 接口是从多个相似类中抽象出来的规范,接口不提供任何实现.接口体现的是规范和现实分离的设计哲学. 接口定义的是多个类共同的公共行为规范,这些行为是与外部交流的通道,这就意味着接口里通常是定义一组公用方法. 接口定义语法: 
      
      [修饰符] interface 接口名 extends 父接口1,父接口2...{
       零到多个常量定义
       零到过个抽象方法定义
      }
     
      修饰符:
       可以是public或省略,省略则默认采用包权限访问控制符.
      接口名:
       与类名采用相同的命名规则,从语法角度来看,接口名只要是合法的标识符即可;如果要遵守Java可读性规范,则接口名应由多个有意义的单词连缀而成,每个单词首字母大写,单词与单词之间无需任何分隔符.
      一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类.  接口里不能包含构造器和初始化块,可以包含属性(只能是常量)、方法(只能是抽象实例方法)、内部类(包括内部接口)和枚举类定义.  由于没构造器和初始化块,接口里定义属性只能在定义时指定默认值.系统默认而且必定使用public static final来修饰接口里的属性.  接口中定义的方法只能是抽象方法,系统默认而且必定使用public static来修饰接口中定义的方法.  接口里定义的内部类和枚举类,系统默认而且必定使用public static修饰符.接口和抽象类之间的差别非常大,这种差别主要体现在二者设计目的上:
     接口作为系统与外界交互的窗口,体现的是一种规范.对于接口的实现者而言,接口规定了实现者必须向外提供哪些服务(以方法的形式来提供);对于接口的调用者而言,接口规定了调用者可以调用哪些服务,以及如何调用这些服务(就是如何来调用方法).当在一个程序中使用接口时,接口是多个模块间的耦合标准;当在多个应用程序之间使用接口时,接口是多个程序之间的通信标准.
     
     从某种程度上来看,接口类似于整个系统的"总纲",它指定了系统各模块应该遵循的标准,因此一个系统中的接口不应该经常改变.一旦接口被改变,对这个系统甚至其他系统的影响将是辐射式的,导致系统中大部分类需要改写. 抽象类则不一样,抽象类作为系统中多个子类的共同父类,它所体现的是一种模板式设计.抽象类作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能(已提供实现的方法),但这个产品依然不能当成最终产品,必须有更进一步的完善,这种完善可能有几种不同方式.个人笔记..