抽象类与接口

常常搞不清抽象类和接口之间的关系,因此决定记下来php

抽象类

  《Thinking in Java》一书中对抽象类的定义为:html

包含了抽象方法的一个类叫做“抽象类”。若是一个类里包含了一个或多个抽象方法,类就必须指定成
abstract(抽象)。不然,编译器会向咱们报告一条出错消息。 web

  其实用关键字abstract修饰的类便是抽象类,即便该类中没有用abstract修饰的抽象方法。编程

抽象方法

  抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:svg

abstract void method_name()

  抽象方法必须用 abstract 修饰,含有抽象方法的类就是抽象类,必须在类前用 abstract 修饰。
因为抽象类中含有无具体实现的方法,因此不能用抽象类建立对象。函数

  由此能够看出抽象类就是为了被继承而存在的,抽象类中包含了子类的共通特性。若是定义了一个抽象类却不去继承它,至关于白白建立了这个抽象类。
  同时,抽象类也跟普通类同样,能够拥有成员变量和普通的成员方法。spa

抽象类和普通类的区别  

  1. 抽象方法必须为public或者protected,缺省状况下默认为public。若是用private修饰,则该方法不能被子类继承,子类便没法实现该方法。
  2. 抽象类不能实例化,即不能建立对象。
  3. 若是一个类继承了一个抽象类,则该类必须实现父类的抽象方法。若是子类没有实现父类的抽象方法,则必须将子类也定义为abstract类。

接口

  接口,英文称做interface。在软件工程中,接口泛指供别人调用的方法或者函数,是对行为的抽象。在Java中,定一个接口的形式以下:code

[public] interface InterfaceName {
}

  接口中能够包含基本数据类型的数据成员和方法,须要注意的是接口中的数据成员都默认为static和final,接口中方法只能是public abstract修饰的抽象方法。
  接口中的全部方法都不能有具体实现。实现接口的类必须实现接口中全部的抽象方法,一个类能够实现多个接口,经过关键字implementsxml

class className implements interface1,interface2,[...]{
}

  若是抽象类实现了一个接口,该抽象类能够不实现接口中的抽象方法。htm

抽象类与接口的区别

参数 抽象类 接口
默认的方法实现 能够有默认的方法实现 接口彻底是抽象的。它根本不存在方法的实现
实现 子类经过extents关键字继承抽象类。若是子类不是抽象类,须要实现父类中全部声明的方法的实现 子类经过关键字implements实现接口,须要提供接口中全部生命方法的实现
构造器 能够有构造器 不能有构造器
与普通类的区别 除了不能实例化,其余的跟普通类没有任何区别 接口是彻底不一样的类型
访问修饰符 抽象类方法能够用public、protected和default修饰 接口方法只能用public修饰,成员属性只能定义为 public static final
main方法 抽象类能够有main方法且能够运行 接口没有main方法,不能运行
多继承 抽象方法能够继承一个类或者实现多个接口 只能继承一个或多个接口
速度 速度比接口要快 接口是稍微有点慢的,由于它须要时间去寻找在类中实现的方法。
添加新方法 若是在抽象类中添加新方法,能够给该方法提供默认的实现,不须要改变如今的代码 在接口中添加新方法后必须改变实现该接口的类




何时使用抽象类和接口 

  1. 若是你拥有一些方法而且想让它们中的一些有默认实现,那么使用抽象类吧。
  2. 若是你想实现多重继承,那么你必须使用接口。因为Java不支持多继承,子类不可以继承多个类,但能够实现多个接口。所以你就可使用接口来解决它。
  3. 若是基本功能在不断改变,那么就须要使用抽象类。若是不断改变基本功能而且使用接口,那么就须要改变全部实现了该接口的类。

参考资料:

  http://www.importnew.com/18780.html
  http://www.importnew.com/12399.html   《Java编程思想》

相关文章
相关标签/搜索