http://android.blog.51cto.com/268543/385282/
抽象类 abstract class
    包含抽象方法的类,叫抽象类。而抽象的概念就是抽象出共同属性:成员变量和方法。所以抽象类可以有private等多种权限的成员变量和非abstract的成员方法。当然抽象方法是一定要有的。
    抽象类是用于单一继承的,不能实例化。而继承类一定要实现抽象方法,因为抽象方法在抽象类里是没有实现行为的,访问权限只能是public。而非抽象方法则可以赋予方法的默认行为,访问权限可以多种,但需要考虑非抽象方法是否需要被继承类访问。
接口 interface
    接口,用于多重继承,也不能实例化。只能包含static final的成员变量,不过在interface中一般不定义成员变量。而成员方法在接口里只能是抽象方法,访问权限只能是public。
 
-----------------
所以,无论抽象类还是接口,抽象方法都需要在子类中实现,而且在子类中实现这些方法一个都不能少。而抽象类里面的非抽象方法,则在子类可以不重写实现里面的行为。参考以下例子:
  1. public class Child extends Children implements Lover{
  2. public Child(String name) {
  3. super(name);
  4. }
  5. public void printName() {
  6. System.out.println(super.getName());
  7. }
  8. public void love(String name) {
  9. System.out.println(name + ", I love you!");
  10. }
  11. public static void main(String[] args) {
  12. Child boy = new Child("Charley");
  13. System.out.println(boy.getName());
  14. Child girl = new Child("Queenie");
  15. girl.printName();
  16. boy.love(girl.getName());
  17. girl.love(boy.getName());
  18. }
  19. }
  20. abstract class Children {
  21. private String name;
  22. public Children(String name) {
  23. this.name = name;
  24. }
  25. //private then Child obj can not access this method
  26. //private String getName() {
  27. public String getName() {
  28. return name;
  29. }
  30. abstract void printName();
  31. //haha()在子类中没有被实现
  32. //abstract void haha();
  33. }
  34. interface Lover{
  35. void love(String name);
  36. }
抽象类和接口的应用
我看了thinking in java里面的内容,感觉似乎用抽象类或者接口实现的效果都差不多,没看出什么特别。那么究竟什么时候应用抽象类,什么时候应用接口呢?看了广泛流传的报警门例子,思考后得到的理解是:抽象类,"is a"关系,抽象出共同的本质特征,单一继承;接口,"like a"关系,个性化特征,多重继承。
 
不同的门都具有本质特征动作 open(), close()。那么抽象类和接口都可以定义这两个方法。现在要求它具有报警alarm功能。
1) 如果这3个功能都放在抽象类里面,那么所有的门都具备了这3个功能,无疑不妥,有的门不需要报警功能啊!
2) 如果这3个功能都放到接口里面,需要用到报警功能的其他类,就需要实现门的open和close功能,这样子也不对!
 
所以,应该把门的open, close和alarm分离,让所有的门都有open, close动作,继承抽象类Door。而需要添加报警功能的门,则再继承接口Alarm。
  1. abstract class Door {
  2.  abstract void open();
  3.  abstract void close();
  4. }
  5. interface Alarm {
  6.  void alarm();
  7. }
  8. class AlarmDoor extends Door implements Alarm {
  9.  void open() { … }
  10.  void close() { … }
  11.  void alarm() { … }
  12. }
 
可以看出,因为抽象类是用于单一继承,接口是用于多重继承,所以需要这样安排。而同时看到,抽象类就是类的本质特征,共同的;接口是个性化的,你想让类更具个性化,则继承其他相应个性特征的接口。

最新文章

  1. python多行字符串
  2. php 远程本地化无后缀图片
  3. LINUX 下安装一些东西,PHP Apach SSL 等
  4. ecshop 团购-》调取评论
  5. Selenium2+python自动化20-Excel数据参数化
  6. 不包含适合于入口点的静态"Main"方法
  7. 苹果App转移图文详解-Transfer App
  8. sqlserver 字符串相关函数
  9. hdu2769:枚举+同余方程
  10. 用Inno Setup制作WEB程序安装包
  11. Solr6.5在Centos6上的安装与配置 (一)
  12. 转:MySQL表名不区分大小写
  13. Java之IO流学习总结【上】
  14. 爬取博主所有文章并保存到本地(.txt版)--python3.6
  15. npm脚本传参问题
  16. Linux中对逻辑卷进行扩容与缩小
  17. <unix网络编程>UDP套接字编程
  18. online ddl与pt-osc详解
  19. Beta冲刺(3/5)(麻瓜制造者)
  20. C++对带有分隔符的字符串 分割为数字的通用解决方案

热门文章

  1. curl命令踩的坑
  2. 通过pd.to_sql()将DataFrame写入Mysql
  3. centos7 安装Mariadb
  4. oracle基于3种方法的大数据量插入更新
  5. SQL Server 2012 AlwaysON 同步延迟时间
  6. Oracle SQL语句积累
  7. POJ3233:Matrix Power Series(矩阵快速幂+二分)
  8. MessageBox.show显示窗口在最上层
  9. 2018-2019 ACM-ICPC, Asia East Continent Finals Solution
  10. Android开发--取消AsyncTask