<java编程思想>第一章读书笔记二

7.伴随多态的可互换对象

前面说了继承,我们知道继承中存在基类(父类)以及导出类(子类),不知道大家有没有遇到过这种情况?就是在向一个方法中传递一个对象作为参数时,我们往往会选择传递一个基类而不是一个子类,为什么要这么做呢?其实原因也很简单,说的高大上一点就是这样做有利于代码的健壮性和可扩展性,说的详细还是有利于代码的健壮性和可扩展性,更重要的也就是可扩展性。

还拿喝可乐的例子来说,如果你传递的参数对象是可乐,那么不管你是给我百事可乐还是可口可乐我都可以接受啊,但是如果你传递的参数仅仅是百事可乐,但是我今天就是想喝可口可乐怎么办?这时候恐怕你就只能再去写一个一模一样的方法,然后传入可口可乐参数,但是可乐只有两种,加入我想喝的是饮料,那么多饮料你每一种都写一个方法吗?那是不现实的,好的解决方法是什么呢?就是书中所说的向上转型,传递参数的时候传递泛化的类型,也就是我们所说的基类,如果有新的类型添加进来的时候只需要继承基类,那么添加新类型时对于方法的调用时没有任何影响的。这就是书中所说的我们在处理类的层次结构时,往往不想把一个对象当做其所属的特定类型,而是将其当做其基类的对象来对待,这样的话方便扩展新的类型,并且扩展新的类型对于现有方法的调用没有任何影响。

但是在将对象当成其基类的对象处理时也有个问题,什么问题呢?我们是人,可以喝出来哪个是百事可乐哪个是可口可乐,但是编译器是机器,它不知道你传入的对象到底是什么,它只知道你传入的是可乐,但是到底是百事可乐还是可口可乐呢,它不知道,所以它就无法去执行对应的代码产生相应的结果,这怎么办?这时候书中提出了后期绑定的概念,什么是后期绑定呢?编译器说不到运行的时候我也不知道要执行哪段代码啊,我就知道传给我的参数必须是这种类型的,我能给你返回的也是固定的,别的别问我,我也不知道。怎么理解这句话?就像喝可乐一样,我不管你给我的是哪种可乐,反正你必须给我一瓶可乐,喝了可乐我才会觉得爽,才能和你愉快的玩耍,就是这个意思。但是执行后期绑定还需要一小段代码,书中说要到第八章再详细展开,这个小段代码是什么我也不知道,到时候再回头解决这个问题吧,现在我也不是很清楚。

这一节最后的部分是使用几何图形的例子说了下多态,话说啊后期绑定也可以叫做动态绑定,在java中这是默认的行为,不需要额外的操作去开启动态绑定,而动态绑定也是实现多态的必要条件。

8.单根继承结构

在java中只存在单根继承也就是我们所说的单继承,也就是一个类只能有一个父类,不能有多个父类,就像你的亲生父亲只能有一个一样,不能多了。在java中所有的类最终都继承自单一的基类Object,这也是我们平时所说的所有的对象都可以看做是一个Object对象,那么单根继承有什么好处呢?

好处主要有三点,其一,所有对象都具有一个共有接口,也就是具有相同的基本类型。什么意思呢?意思就是张三是一个人,李四也是一个人,王五还是一个人,编程里面就是Person是一个Object,Animal也是一个Object,所有的对象归根结底都是一个Object,也就是你可以使用Object来代替任何你想要的对象,也可以说是任何你想要的对象都可以使用Object来占位。这就是第一点好处,那么第二点好处是什么呢?第二点好处是所有的对象都具有某些功能,我们在看jdk的API的时候任意点开一个类,在类的方法一栏我们都会看到一个clone()方法,也就是说任意一个对象我们都可以调用clone()方法,当然还有一些其他的共有方法,这些方法保证你在任何一个对象上都可以执行一些操作。第三,单根继承让垃圾回收变得简单了很多,对于垃圾回收这块我的认识也比较少,所以就不献丑了,以后有机会再专门研究垃圾回收这块。

9.容器

顾名思义,容器嘛,当然是用来装东西的,可乐瓶子就是容器,拿来装可乐的,但是java里面的容器可不是拿来装可乐的,关于这个我们要知道两点,其一,java里面的容器装的不是东西,而是对象,确切的说应该是对象的引用,第二,java里面的容器持有其他对象的引用,但是其本身仍然是一个对象。此外在java里面我们把容器称之为集合,相信大家也知道集合框架在java里面是很重要的一部分内容,比较常见的集合有List,Map,Set这三个,

他们分别应用在不同的场景之下,这个等后面学到集合框架的时候我们在详细说吧,但是有一点我们现在需要知道,那就是既然集合就是持有其他对象的引用的一个对象,说的直白点就是现在有一个人,你可以代表一群人,出事了你扛着,但是为什么要设计那么多的集合呢?为什么不单单设计一个List,反而还要设计什么Map啊Set啊这些呢?关于这点主要有两个原因,第一点,不同的集合提供不同类型的接口和外部行为,例如list用来存储序列,但是Map用来存储键值对,他们的作用不同;第二点,不同的集合对于某些操作具有不同的效率,比如ArrayList和LinkedList的比较。

大家可能见过这样创建集合的List<String> list = new ArrayList<String>(),为什么要在尖括号中间加上一个String呢,其实这里的String可以换成任何类型,甚至可以换成Object,其实在java SE5之前是没有List<String>这种写法的,只能写成List,但是在java SE5之后出现了泛型的概念,List<String>就是带有泛型的集合,表示什么意思呢?它表示在这个list集合中你只能存入String类型的变量,存别的编译器是不认得,就像一个仓库只能拿来放钱,你要是把白纸放进去了看门的不让你进去一样。为什么要添加泛型呢?这是因为在java SE5以前单单写一个List你知道它里面存的是什么吗?如果这个List是由你创建的,你也知道你往里面存入了字符串对象,但是别人不知道,别人如果存入一个数字对象怎么办?而且存的时候不会出现错误,但是取得时候就出问题了,什么问题呢?你存了一个字符串,第二个人存了一个数字,第三个人存了一个Person对象,但是你取得时候都是按照字符串对象来取的,你说能不出错吗?不带泛型的集合就如同是List<Objetc>这样的集合,只要你是对象,那么我来者不拒,我们都知道所有的对象都继承自Object,那么即使你存入的是一个数字对象,它也会向上转型为Object,这是完全没有问题的啊,但是当你取出这个对象的时候就是向下转型,我们要知道一点,向上转型是不会出现问题的,但是向下转型时,即使在你明确知道类型是什么的情况下你也要强制转换这个对象的类型,如果你不知道对象的类型,那么是很不安全的做法,基于以上的原因,java  SE5以后就加入了泛型的概念,就相当于是规定了集合中能够存入的类型,这样这个集合中就只能存入这种类型的对象,就不会出现向上转型和向下转型的问题了。

第一章的部分暂时就写到这里,对象的创建和生命周期这一节我憋了两天没写出来一个字,因为单纯看书中的解释感觉很晦涩,不知道该怎么去理解,更不用说用自己的语言表达出来了,主要是我个人的对于这一块的理解也不到位,我也去网上查了一下这部分的内容,对于对象的生命周期的文章都写的很好,大家可以去参考一下,等我有能力驾驭这一块的时候再来把这个文章完善一下,至于后面的异常和并发编程以及internate本来我也没打算详细写,因为书中对着三部分都是简单的介绍,等看到对应的章节的时候再详细理解。

最后想说一下想写出来点东西真的很难,书看的比较快,但是写文章就慢好多,一星期也就是出来一篇文章。继续努力,下周争取把第二章写出来。

时间: 2024-10-18 15:41:58

<java编程思想>第一章读书笔记二的相关文章

Java编程思想 第一章、对象导论

对象导论阅读理解: 1.解决问题的复杂性直接取决于抽象的类型和质量(抽象类型及抽象的是什么?). 汇编语言是对底层机器的轻微抽象,而C.Basic等指令式语言都是对汇编语言的抽象,它们所做的主要抽象仍要求在解决问题时 要基于计算机的结构,而不是基于要解决的问题的结构来考虑,Java语言与C.Basic等相反,其面向问题空间的抽象而非计算 机底层实现来考虑问题结构. 2.解空间及问题空间 解空间:对应于机器模型,问题建模的地方: 问题空间:实际解决问题的模型,问题存在的地方,如一项业务: 3.对象

Java编程思想-第一章(1)

简介 这是第一次写读书总结,我不想说太多的豪言壮志只想可以这样一直坚持下去. 1.1 抽象过程 最早出现的计算机语言,汇编语言是对底层机器的轻微抽象,而其后所谓的命令式语言,如C,BASIC等都是对汇编的抽象,它们所做的主要抽象是解决问题基于计算机结构,而不是基于解决问题的结构考虑,所以程序难以编写,且维护代价高oop面向对象语言允许根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题,所以这是一种更强有力的语言抽象 前人总结了面向对象的五个基本特征: 万物皆对象:将对象视为奇特变量,可

java编程思想第一章

1.抽象过程Alan kay 总结的面向对象的编程语言: 万物皆为对象. 程序是对象的集合,他们通过发送信息来告诉彼此所要做的. 每个对象都有自己的由其他对象所构成的存储. 每个对象都拥有其类型. 某一特定类型的所有对象都可以接受同样的信息. Booch对对象有一个更简洁的描述:对象是具有状态,行为和标识.这意味着每一个对象哪个都可以拥有内部数据(他们给出了该对象的状态)和方法(它们产生行为),并且每一个对象都可以与其他对象区分开来,就是说每一个对象在内存中有唯一的地址.2.每一个对象都有一个接

学习java编程思想 第一章 对象导论

一.面向对象的五个基本特性: 1.万物皆为对象.将对象视为奇特的变量,他可以存储数据,还可以要求它在自身上执行操作. 2.程序是对象的合集,他们通过发送消息告诉彼此所要做的. 3.每个对象都有自己的由其他对象所构成的存储.换句话说,可以通过创建包含现有对象的包的形式来创建新类型的对象. 4.每个对象否拥有其类型.每个类最重要的特性就是"可以发送什么样的消息给它". 5.某一特定类型的所有对象都可以接受同样的消息. 二.在试图开发或理解一个程序设计时,最好的方法之一就是将对象想象为&qu

《内核设计与实现》第一章读书笔记

<内核设计与实现>第一章读书笔记 第一章:Linux内核简介 1.1 Unix的历史 Unix强大的特点 A.简洁,几百个系统调用,明确的设计目的 B.文件对待所有东西 C.移植性强(C语言) D.进程创建快,使用fork()系统调用. E.进程间通信元语,进程间通信机制 1.2 linux的简介 Linux系统的基础是内核.C库.工具库和系统的基本工具. 1.3 操作系统和内核简介 内核:管理者,操作系统的核心 通常一个内核由负责响应中断的中断服务程序和网络.进程间通信等系统服务共同组成.

java编程思想 第二章

这篇时间较之前篇章时间靠后,是由于,某一天晚上看完Java编程思想文献之后来不及做笔记了. 以下笔记基本为转载,不是原创 第二章   一切都是对象 目录: 2.1 用引用操纵对象 2.2 必须由你创建所有对象 2.3 永远不需要销毁对象 2.4 创建新的数据类型:类 2.5 方法.参数和返回值 2.6 构建一个Java程序 2.7 你的第一个Java程序 2.8 注释和嵌入式文档 2.9 编码风格 2.1 用引用操纵对象 一切都看作对象,操纵的标识符实际上是对象的一个“引用”,遥控器(引用)操纵

《现代前端技术解析》第一章读书笔记(未完成)

今天是2017年6月26日,星期一,开始从第一章看起.第一章主要讲的是前端技术的发展概况以及一些必须掌握的浏览器基础知识与常用开发技术. 页面内容多而复杂,为了保证开发效率,我们可以借助符合特定场景的前端框架来提高开发效率,例如使用JQuery丶MVVM等开发框架,对常用的 HTML DOM 操作进行高效封装,大大简化开发工作量,提高效率. 前端项目代码越来越多丶结构越来越复杂,我们必须考虑用模块化和组件化的思路来管理.所谓的模块化和组件化是指采用代码管理中分治的思想,将复杂的代码结构拆分成多个

《构建之法》第一章读书笔记

工程有了一个初步的了解.介绍了软件工程里的一些基本概念,软件开发的几个阶段.软件工程的特殊性.目标以及软件工程与计算机科学之间的联系与区别.    软件工程作为一门新兴的学科,是连接计算机硬件和传统机械工程的一个桥梁.起先,我所认为的软件工程单纯的只是编程,通过算法实现正确的输出而已.但在构建之法的第一章中,我认识到会写程序只是一个合格的软件工程师最基本的素质.一个完整的项目,应该在需求分析,软件构架设计.代码实现.程序测试.软件发布运营及维护每个阶段都尽职尽责,并结合用户体验去完善软件的每一个

&lt;&lt;UML for Java Programmers&gt;&gt; 第11章读书笔记

这一章提到新手做设计时的常见错误. 我最喜欢这一章,以前看的时候,为了追求所谓的速度,把书中的实例统统略过,真有点买椟还珠的味道.另外说明一下,读书笔记为什么突然跳到第11章. 最简单的原因是因为我对这一章有感觉,觉得有必要做笔记. 常见的如下: 1. 没有方法的类(MissingMethods).没有方法的类是没有存在价值的,"programs are about behavior!",我们应该根据行为来划分软件系统.如果不是根据行为来划分软件,说明用了其它错误的划分方法. 2. 真