尝试用简单的语言,讲述复杂的事情。

如发现文中的错误,或内容需要补充,忘不吝指教!

CHALLENGE 2.1

Write down three differences between abstract classes and interfaces in Java.

要想回答这个问题首先要搞清楚几个概念问题。给出了一些概念在此引用

http://blog.csdn.net/chenssy/article/details/12858267

1.抽象类是什么

一个具有abstract methods的类叫做抽象类,抽象类中可以不含有任何抽象方法,但是如果类中含有一个或多个抽象方法那么该类必须声明为抽象类(并不强制所有方法都是abstract的)。

如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。比如new Animal(),我们都知道这个是产生一个动物Animal对象,但是这个Animal具体长成什么样子我们并不知道(depend on runtime info),它没有一个具体动物的概念,所以他就是一个抽象类,需要一个具体的动物,如狗、猫来对它进行特定的描述,我们才知道它长成啥样。

在面向对象领域由于抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能实例化的。

2.为什么会有不含有任何抽象方法的抽象类

因为抽象类是不能实例化的,所以可以通过对类声明abstract来阻止该类的实例化。

3.抽象类的作用

由于面向对象和运行时绑定的存在,我们无法在编译期间确定所有生成的具体对象,即多态的概念(polymorphism).我们通过建立一个basic abstract class 为所有derived class提供一些common method。以便我们可以通过这些common method来操作derived classes。用C++中的说法就是用父类的指针去操作子类instance,在Java中应该说是用父类的reference去操作子类的instance。所以抽象类的作用就是让其他类来继承它。

4.抽象类一些要求

1、抽象类不能被实例化(不能new 可以声明reference),这是因为抽象类无法描述一个完整的instance 所以要到运行时子类来instantiate.

2、抽象方法必须(Must be)由子类来进行重写,这是因为abstract class中的abstract method都是空方法,子类不实现它就无法使用。

3、只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。

4、抽象类中可以包含具体的方法,当然也可以不包含抽象方法。

5、子类中的抽象方法不能与父类的抽象方法同名。

6、abstract不能与final并列修饰同一个类。这个很容易理解吧,abstract的意思就是让其他类来继承,final修饰class就是表示这个类不让别的类继承,同时修饰一个类就矛盾了。

7、abstract 不能与private、static、final或native并列修饰同一个方法。Abstract method就是留给子类实现的,要么是protected的要么是public的,否则子类得不到这个方法。Static会似的该方法静态化,可以直接通过abstract class来调用,但是abstract方法是空的,这样做是没意义的。

4.接口的作用

Interface使得所有实现了该接口的类建立了一套协议(protocol),使得这些类有了一套相同的manipulation。此外,在java中不能multiple inheritance所以无法通过继承抽象类来同时拥有多套common method。但是一个class可以实现多个interface,从另一个方面解决了 multiple inheritance的需求。

5..接口的一些要求

(1)    Interface的方所有法访问权限自动被声明为public。确切的说只能为public,当然你可以显示的声明为protected、private,但是编译会出错!(interface就是强迫实现他的类完成该interface的所有方法,再去隐藏方法就没有意义了)

接口中可以定义“成员变量”,或者说是不可变的常量,因为接口中的“成员变量”会自动变为为public static final。可以通过类命名直接访问:ImplementClass.name。(因为interface并不会被实例化这些变量只是用来辅助记录一些interface的信息,放到常量区中存放)

(2)    接口中不存在实现的方法。(前面已经介绍过了,所有方法都是空body的)

实现接口的非抽象类必须要实现该接口的所有方法。抽象类可以不用实现。(抽象类实现一个接口的目的是:让继承该抽象类的子类去完成所有的事情,无需在抽象类中做具体实现,这是因为可能不止一个类需要继承这个abstract class,无法确定interface中的方法到底应该是怎么样实现的)

(3)不能使用new操作符实例化一个接口,但可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象(类似多态的感觉 Interface referece A = new Obj_Implemented)。可以使用 instanceof 检查一个对象是否实现了某个特定的接口。例如:if(anObject instanceof Comparable){}。

在实现多接口的时候一定要避免方法名的重复。

现在回到Design Pattern的 Challenge吧

Interface与Abstract class 的异同

  1. 一个类可以实现多个interface,但是最多只能继承一个Abstract class
  2. Abstract class 可以含有具体的(implemented的方法),而Interface中的全是空body的方法
  3. Abstract class可以使用成员变量,而Interface的成员变量都只能是static final的
  4. Abstract class可以通过 public,protected,private来修饰那些具体的方法,但是不能用private或者static,native等去修饰抽象的方法。而Interface中的方法都只能是public的,如图所示
  5. Abtract class可以定义constructor,Interface不行
abstract class C
{public void method(){};private void pri_method(){};void pack_method(){};abstract public void ab_pub_method();abstract protected void ab_pro_method();abstract private void ab_pri_method();//error}
interface A
{protected void A();//errorabstract void B();
}


 

Design Pattern in Java[Challenge 2.1]相关推荐

  1. Design Pattern - Service Locator Pattern--转载

    原文地址:http://www.tutorialspoint.com/design_pattern/service_locator_pattern.htm The service locator de ...

  2. Java Singleton Design Pattern (单例模式 SE7 Gold)

    singleton design pattern offer 2 things: one and only one instance of the class, and a global single ...

  3. Design Pattern: Observer Pattern

    1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Use Case 首先我们来面 ...

  4. Design Pattern Quick Overview

    Do we really need this design pattern? Just ignore, all the big guys requires it. For you, just unde ...

  5. 设计模式之-观察者模式(Observer Design Pattern)

    当你订阅一个感兴趣主题消息,内容发生任何变化时都能够得到通知,观察者模式对你是非常有帮助的.在观察者模式中,一个对象监控另一个对象的状态,那这个对象被称为观察者,被监视的对象被称为主题. 一个主题对象 ...

  6. Design Patterns in Java

    <Design Patterns in Java> 作者:Steven John Metsker,William C. Wake 出版日期:2006-04-28 语言:English 版本 ...

  7. [转]Design Pattern Interview Questions - Part 2

    Interpeter , Iterator , Mediator , Memento and Observer design patterns. (I) what is Interpreter pat ...

  8. C# 版本设计模式(Design Pattern)(转)

    C# 版本设计模式(Design Pattern)---------------总序 今天在写代码的时候,突然想到了一个非常有趣的问题,就是非常经典的一个问题:猫叫了,老师跑了,主人醒了. 也不知道自 ...

  9. 源于Design Pattern Explanation with C++ Implementation的 设计模式 C++

    1.创建型模式 (Creational Pattern) 1.1 工厂模式(Factory Pattern ) 1.2  抽象工厂模式(Abstract Factory Pattern ) 1.3   ...

最新文章

  1. IBM确定公司未来存储技术发展方向
  2. c运行库、c标准库、windows API都是什么玩意
  3. Xilinx zynq-7000 SOC 设计导论
  4. SamplePairing:针对图像处理领域的高效数据增强方式 | PaperDaily #34
  5. 扎心!天天写代码,方向真的对吗?
  6. Jupyter 安装并配置工作路径[转]
  7. Getter DI是个好主意吗?
  8. PAT L1-027 出租
  9. Flutter布局锦囊---男女性别单选
  10. 宏excel怎么计算机,excel宏的使用/EXCEL 如何关闭宏
  11. 跟着Code走,详解Symbian Client/Server架构
  12. [分析力学]解题思路 - 拉格朗日方程
  13. 伪随机数认识 以及 公平的抽奖
  14. Vector的自动排序Sort
  15. BUG:索引字段超长-Specified key was too long; max key length is 767 bytes
  16. 怎么禁止电脑端的爱番番弹窗出现?
  17. 服务器上SQLserverAgent无法启动的解决方法
  18. uniapp微信小程序图片上传
  19. 高频变压器的设计与制作
  20. 反锐化掩膜_图像反锐化掩膜算法研究解析.doc

热门文章

  1. 【数据平台】sklearn库特征工程之特征选择和降维
  2. AES加密解密算法Java实现
  3. 两个单链表相交的一系列问题
  4. html中选择收货地址时候,收货地址.html
  5. python爬虫的应用-python网络爬虫应用实战
  6. AOP原理-创建AOP代理--AnnotationAwareAspectJAutoProxyCreator【InstantiationAwareBeanPostProcessor】的作用
  7. Spring的单元测试
  8. 实用技巧:使用 jQuery 异步加载 JavaScript 脚本
  9. hikaripool连接保持_springboot2的hikari数据库连接池默认配置
  10. 【Pytorch学习】用pytorch搭建第一个神经网络