为什么80%的码农都做不了架构师?>>>   

1.7伴随多态的可互换对象

在几何形例子中,方法操作都是泛化的形状,不关心它们是圆形,正方形,三角形什么未定义的形状。所有的几何形都可以被绘制,擦除和移动,所以这些方法都是直接一个几何形对象发送消息,它们不用担心对象将如何处理信息。这样的代码是不会受添加新类型影响的,而且添加新类型是扩展一个面向对象程序以便处理新情况的最常用方式。例如,可以从“几何形”中导出一个新的子类型“五角形”,而并不需要修改处理泛化几何形状的方法。通过导出新的子类型而轻松扩展设计的能力是对改动进行封装的基本方式之一。这种能力可以极大地改善我们的设计,同时也降低软件维护的代价。

但是,在试图将导出类型的对象当作其泛化基类型对象来看待时,(把圆形看作是几何形,把自行车看作交通工具,把鸬鹚看作是鸟等等),仍然存在一个问题。//问题1

如果某个方法要让泛化几何形状绘制自己,让泛化交通工具行驶,或者让泛化的鸟类移动,那么编译器在编译时是不可能知道应该执行哪一段代码的。

因此,编译器无法精确地了解哪一段代码将会被执行,那么它该怎么办?//问题2

例如那么,这是如何发生呢?//问题3

这个问题答案:编译器不可能产生传统意义上的函数调用。一个非面对对象编程的编译器产生的函数调用会引起所谓的前期绑定,这么做意味着编译器将产生对一个具体函数名字的调用,而运行时将这个调用解析到将要执行的代码的绝对地址。然而在OOP中,程序直到运行时才能够确定代码的地址,所以当消息发送到一个泛化对象时,必须采用其他的机制。//问题4

为解决这个问题,面向对象程序设计语言使用了后期绑定的概念。

当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查(无法提供此类保证的语言被称为弱类型的),但是并不知道将被执行的确切代码。

例:

void doSomething(Shape shape) {

shape.erase();

//...

shape.draw();

}

这个方法可以与任何Shape对话,因此它是独立于任何它要绘制和擦除的对象的具体类型 的。

如果程序中其他部分用的doSomething()方法,

Circle circle = new Circle();

Triangle triangle = new Triangle();

doSomething(circle);

doSomething(triangle);

doSomething(line);

对于doSomething()的调用会自动地正确处理,而不管对象的确切类型。

当Circle被传入预期接受Shape的方法中,究竟会发生什么?

由于Circle可以被doSomething()看作是Shape,也就是说,doSomething()可以发送给Shape的任何消息,Circle都可以接收,那么,这么做就是完全按去且符合逻辑了。

注意:这些代码并不是说“如何使Circle,请这样做;如果是Square,请这样做……”,如果编写了这样检查Shape所以实际可能类型的代码,那么这段代码肯定是杂乱不堪的,而且在每次添加了Shape 的新类型之后都要去修改这段代码。

这里所以表达的意思仅仅是“你是一个Shape,我知道你可以erase()和draw()你自己,那么去做吧,但是要注意细节的正确性”。

转载于:https://my.oschina.net/869088067/blog/714116

Java编程思想1-对象导论相关推荐

  1. Java编程思想之对象入门

    一.Java编程思想之对象入门 前言 1.面向对象程序设计 2.接口的由来----接收请求 3.public,private,protected的由来----实现方案的隐藏 4.成员对象的由来---- ...

  2. Android人生整理第二章:Java编程第一节-对象导论

    抽象过程:建立解空间(问题建模) 和问题空间 (问题存在) 关联 万物皆为对象 程序是对象的集合,通过发送消息来告知彼此要做的 每个对象都有自己的由其他对象构成的存储 所有对象都有类型 某一特定类型的 ...

  3. JAVA编程思想学习笔记——第一章 对象导论

    搞了一年多java,野路子出身,发现java基础这块还是相当的薄弱!故决定学习<Java编程思想>这本书.在此把学习的知识点记录下! 面向对象的五大特性 1.万物皆为对象 2.程序是对象的 ...

  4. Java编程思想学习(一)----对象导论中多态的理解

    1.1抽象过程 1)万物皆对象. 2)程序是对象的集合,他们通过发送消息来告知彼此所要求做的. 3)每个对象都有自己的由其他对象所构成的存储. 4)每个对象都拥有其类型. 5)某一特定类型的所有对象都 ...

  5. 【Java编程思想】一、对象导论

    Thinking in Java 作为一个电子专业的人,在学习了将近3年的嵌入式技术后,决定投奔移动互联网,在互联网大潮中急流勇进! 为了学习OOP(Object-oriented Programmi ...

  6. 《Java编程思想》学习笔记【一对象导论】

    重头学习Java,大一没怎么学,大二上课也没听.(流下不学无术的眼泪) 所有编程语言都提供抽象机制,我们所能解决的问题的复杂性直接取决于抽象的类型和质量. 汇编语言是对底层机器的轻微抽象," ...

  7. java 四舍五入_《JAVA编程思想》5分钟速成:1-4章:概述

    前言: 1.面向对象的特征有哪些方面? 2.Math.round(11.5) 等于多少? Math.round(-11.5)等于多少? 3.float f=3.4;是否正确? 4.short s1 = ...

  8. Java编程思想 (1~10)

    [注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第一章 对象导论 1.万物皆对象 2.程序就是对象的集合 3.每个对象都是由其它对象所 ...

  9. 【Java编程思想】

    Java编程思想(一) https://blog.csdn.net/weixin_40841731/article/details/83861285 MikeShine 2019.04.22 20:1 ...

  10. 《JAVA编程思想》学习笔记:第1-4章(Java概述)

    全书目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章 ...

最新文章

  1. Error: Cannot find module ‘express‘
  2. AS3.0(3)-函数;类;对象
  3. pip freeze requirements.txt 分隔 sudo pip install -r requirements.txt
  4. 汇编中的扫描码、ASCII码(也称字符码)、扩展码、虚拟键码 的区别
  5. Asp.net mvc 添加Jquery UI
  6. 关于解决form表单记录上次保存填写记录清空
  7. 爬虫 spider10——搭建elk平台,开发服务提供者
  8. 在Linux下编译安装Apache2(2)
  9. Android adb远程调试
  10. 注解代替枚举_精选枚举代替开关
  11. 乐刻运动 app android,乐刻运动
  12. git 短写设置_如何在短短几分钟内设置一个Git客户端
  13. java heap buffer direct buffer_java NIO - DirectBuffer 和 HeapBuffer
  14. asp.net core系列 40 Web 应用MVC 介绍与详细示例
  15. virus.win32.xorer病毒
  16. Unicode和ASCII的区别
  17. 2016年04月28日-统一沟通之OCS 2007 R2-公开课-通知
  18. 安装nuxt_一天上手Nuxt基于vue服务端渲染
  19. matlab x对数坐标,matlab 对数坐标
  20. 为啥E进制计算机的效率最高?

热门文章

  1. 【OpenCV学习笔记】【教程翻译】一(基于SVM和神经网络的车牌识别概述)
  2. leetcode刷题日记-1044. 最长重复子串
  3. 机器学习——seaborn可视化
  4. 【ArcGIS|空间分析】志愿者分配管理区域内共享单车(全国大学生GIS技能大赛试题)
  5. mysql 一对多约束条件_MySQL数据库/约束条件与表关系.md · 静谧之裳/python-learn - Gitee.com...
  6. 实习踩坑之路:LocalDateTime计算间隔天数,compareTo/Period的beetween方法导致的bug
  7. 递归 解决汉诺塔问题(栈应用)
  8. activity+window+view简单说明
  9. Android ListView观察者模式的应用
  10. mdac版本过低怎么解决_工业铝型材硬度过低怎么解决