详解接口和抽象类
相似性:
1:两者都可以看作是抽象类,因此不能被直接实例化,可以声明接口或抽象类变量。
解释:不能直接用new关键字生成接口或者抽象类的实例,实例化在子类中实现。
2:两者都可以看作是需要被继承(实现)的,实例化发生在子类对象实例的生成。
解释:接口和抽象类都是别人的嫁衣,定义了相应的规范,是一种行为约束。
3:两者的非私有成员变量都可以在子类中被引用。
解释:实现接口或继承抽象类都可以获得接口或抽象类的成员变量,也就是属性。
4:两者的抽象成员方法都是只有方法定义体而不能有方法实现。
解释:语言本身的原则,不需要太多的为什么,正是需要被实现或者继承的原因所在。
5:两者的所有抽象成员方法必须在实现或者继承它们的子类中全部实现。
解释:语言本身的原则,若非如此,这些方法岂不是没有用武之地,删除得了。
6:两者的所有抽象成员方法在实现或者继承它们的子类中实现时,要具有相同的方法名、返回值类型、参数个数、参数类型和参数顺序。
解释:这才体现了作为实现或者继承方的诚意,要遵循抽象出来的规范。
不同点:
1:接口是用来实现的;抽象类是用来继承的。
解释:表达上更贴切实质一些,对两者进行一下区分,也可以理解为不尽相同的继承。
2:接口实现关键字implements;抽象类的继承关键字extends。
解释:这个还需要解释吗?这个语言本身定义的规范,服从----有时候是一种聪明的选择。
3:一个类可以实现多个接口,一个类最多可以继承一个抽象类。
解释:完全面向对象语言本身就不支持多重继承,接口是一个很好的解决方案。
4:接口的所有成员方法都必须是抽象方法;抽象类的成员方法可以有抽象方法。
解释:没什么好说的,接口内的方法必须都是抽象方法,抽象类可能有抽象方法。
5:接口中所有成员不能被定义成private;抽象类中抽象方法不能被定义成private。
解释:不同点4可以解释为什么会是这样。以上是个人联系理论并加以测试实践总结的,疏漏之处在所难免,将不断完善,也请各路高手不吝赐教,提出宝贵意见。

解决方案 »

  1.   

    详解接口和抽象类
    相似性: 
    1:两者都可以看作是抽象类,因此不能被直接实例化,可以声明接口或抽象类变量。
    解释:不能直接用new关键字生成接口或者抽象类的实例,实例化在子类中实现。 
    2:两者都可以看作是需要被继承(实现)的,实例化发生在子类对象实例的生成。
    解释:接口和抽象类都是别人的嫁衣,定义了相应的规范,是一种行为约束。 
    3:两者的非私有成员变量都可以在子类中被引用。
    解释:实现接口或继承抽象类都可以获得接口或抽象类的成员变量,也就是属性。 
    4:两者的抽象成员方法都是只有方法定义体而不能有方法实现。
    解释:语言本身的原则,不需要太多的为什么,正是需要被实现或者继承的原因所在。 
    5:两者的所有抽象成员方法必须在实现或者继承它们的子类中全部实现。
    解释:语言本身的原则,若非如此,这些方法岂不是没有用武之地,删除得了。 
    6:两者的所有抽象成员方法在实现或者继承它们的子类中实现时,要具有相同的方法名、返回值类型、参数个数、参数类型和参数顺序。
    解释:这才体现了作为实现或者继承方的诚意,要遵循抽象出来的规范。
    不同点: 
    1:接口是用来实现的;抽象类是用来继承的。
    解释:表达上更贴切实质一些,对两者进行一下区分,也可以理解为不尽相同的继承。 
    2:接口实现关键字implements;抽象类的继承关键字extends。
    解释:这个还需要解释吗?这个语言本身定义的规范,服从----有时候是一种聪明的选择。 
    3:一个类可以实现多个接口,一个类最多可以继承一个抽象类。
    解释:完全面向对象语言本身就不支持多重继承,接口是一个很好的解决方案。 
    4:接口的所有成员方法都必须是抽象方法;抽象类的成员方法可以有抽象方法。
    解释:没什么好说的,接口内的方法必须都是抽象方法,抽象类可能有抽象方法。
    5:接口中所有成员不能被定义成private;抽象类中抽象方法不能被定义成private。
    解释:不同点4可以解释为什么会是这样。 
    以上是个人联系理论并加以测试实践总结的,疏漏之处在所难免,将不断完善,也请各路高手不吝赐教,提出宝贵意见。
      

  2.   

    你的理解无可厚非,遗憾的是你还是停留在就事论事的层面上。
    接口和抽象类有本质的不同,这种比较没有什么意义。抽象类再抽象,也是一个类,除了不能被直接实例化以外,它和一般类没有丝毫区别。
    而接口和类(包括抽象类和具象类)不是一个层面上的东西。
    类是对对象的抽象,接口是对类的抽象。拿类和接口作比较,就好比拿人和生物作比较一样,没有可比性。再说实例化这一点,抽象类永远是要被实例化的(虽然这种实例化过程由它的派生类隐式完成),也就是说,抽象类拥有自己的实例,而且这个实例占内存空间;
    而接口是不可能拥有自己的实例的,接口中定义的东西被它的实现类所“消化吸收”,接口的作用是无形的。抽象类的真实作用远远被人们高估了。
    实际上,抽象类唯一的作用是防止类被直接实例化,而这也可以用private构造函数来解决。
    所以说,抽象类其实是个可有可无的东西。把它和接口相提并论,实在是小题大做。JAVA之父James Gosling说,如果让他重新设计JAVA,他会摒弃继承,因为接口可以解决一切问题。C++的多重继承并没有很好地实现对现实世界的“建模“,相反,它把问题搞得更加复杂。
    而接口无疑是解决这一问题的最佳答案,接口不参与到类的范畴之中,而是从“侧面“对类进行整理,规范和约束。这种模式显然比传统的继承模式好的多。