点击蓝色“程序员黄小斜”关注我哟

加个“星标”,每天带你读好书!

文/黄小斜

转载请注明出处

不管你是Java新人,还是Java老司机,相信你都听说过一本叫做《Java编程思想》的书籍,这本书籍在Java界可以说是大名鼎鼎,被封为Java圣经,常年在Java书籍的销量榜上霸榜。

那么这本书真的有这么神奇么,对于一个Java新手或者初级程序员的帮助是否也能和它的名气一样大呢,今天,我们就一起来研究一下这本书,看看它到底有没有外界说的那么神奇,带着这样的困惑,让我们一起走进科学。

先来看看百度百科对于这本书的介绍

本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形。从Java的基础语法到最高级特性(深入的面向对象概念、多线程、自动项目构建、单元测试和调试等),本书都能逐步指导你轻松掌握。

从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作。本书共22章,包括操作符、控制执行流程、访问权限控制、复用类、多态、接口、通过异常处理错误、字符串、泛型、数组、容器深入研究、JavaI/O系统、枚举类型、并发以及图形化用户界面等内容。这些丰富的内容,包含了Java语言基础语法以及高级特性,适合各个层次的Java程序员阅读,同时也是高等院校讲授面向对象程序设计语言以及Java语言的绝佳教材和参考书。

可以看出,这本书是非常具有综合性的,并且把基础和进阶、乃至实战的内容都融合到了书里,这样的好处就是大而全,但是缺点就是一上来就是长篇大论,对于新手来说极不友好。

相信没有几个Java初学者是能够把这本书看完并理解的,那么,为什么这本书如此经典,却对新手这么不友好呢,我想,这也和作者个人的经历有关系,下面我们就来看看这个大牛作者是何方神圣吧。

作者介绍

Bruce Eckel是MindView公司的总裁,该公司向客户提供软件咨询和培训。他是C++标准委员会拥有表决权的成员之一,拥有应用物理学学士和计算机工程硕士学位。除本书外,他还是《C ++编程思想》的作者,并与人合著了《C ++编程思想 第2卷》(这两本书的英文影印版及中文版均已由机械工业出版社引进出版)及其他著作。他已经发表了150多篇论文,还经常参加世界各地的研讨会并进行演讲。

Bruce Eckel从1984年至今,已经发表了超过150篇计算机技术文章,出版了6本书(其中4本是关于C ++的),并且在全世界做了数百次演讲。他是《Thinking in Java》、《Thinking in C ++》、《C ++ Inside & Out》《Using C ++》和《Thinking in Patterns》的作者,同时还是《Black Belt C ++》文集的编辑。.

看了上面的作者介绍,总结起来就是一个技术大牛,精通C++ 和Java,同时是个学术界的大佬,这样的人,认知水平和技术能力都和普通人不是一个量级的所以写出来的书,即使已经力求亲民,但是本书还是不免会有很多晦涩难懂的内容,并且时常还会引入C++ 的一些语言特性,这让很多新手和没有C++ 经验的人很茫然。

所以,这本书压根不适合新手看,而适合有经验有基础的Java工作者来看。

当然,你也会好奇,这本书到底讲了些什么,我现在适不适合看呢,后面的内容,我们会对本书的章节进行一些拆解和讲述,以便让你对这本书的脉络有一定的了解。

这本书适合你么?

适合人群:不建议Java新手看,适合有一定工作经验的Java程序员看

前置条件:看过其他较为基础的Java书籍,否则看这本书会比较痛苦

带你读《Java编程思想》

这已经是我第N次翻开这本书了,但是我一直没有勇气真正地把它读完,因为每次我都会被一些复杂的概念和晦涩的语言给吓跑。

这次为了帮大家讲好这本书,我决定仔仔细细地研读它一番,到底这本书值不值得你去读,请你跟着我的脚步来看看这本书到底讲了些什么吧。

第一章:对象导论

看到这个目录我相信很多人都会一脸懵逼,我们熟悉的面向对象技术不就是继承、封装加多态么,最多再加上接口和抽象类,为什么这里的内容会这么多呢。

个人认为这是这位作者的风格,别忘了,Bruce Eckel从1984年至今,已经发表了超过150篇计算机技术文章,所以这本书里也有很多具有学术色彩的语言描述,再加上翻译国外书籍的自带buff(通常翻译过来之后更加难懂)使得这本书很多内容都很难让人理解。

即使我现在重新看这本书,都必须要跳着看,因为很多复杂的概念我是不想去碰的,相信我们上次讲的那本《head first Java》大家还有点印象,那本书是尽可能把概念讲简单,阅读体验更好。

特别是对于新手来说,直接看这本《Java编程思想》绝对是自寻劝退,而且,我相信也没有几个人有耐心把全书看完。

再来看看这个总结,作者还是会把读者带入成有一定经验的Java程序员来看待,比如他会假设你熟悉面向过程的语言,而且会把OOP的优点讲的非常玄乎,让人看完之后直呼“nb”但是确实不知道他在讲些什么。

当然,这本书被奉为经典自然有它的原因,毕竟这本书原本的定位就不是给小白看的,如果我们从一个有经验的Java程序员的角度思考,是不是能挖掘出更多的宝藏呢,不妨一起继续往下看。

第二章:一切都是对象

有了第一章的铺垫,我已经对作者的风格有所了解了,确实比较随性飘逸,第二章的标题虽然叫做“一切都是对象”,但实际上讲的东西比较综合。

除了讲解对象的引用、对象的内存分配,对象的垃圾回收等概念,还讲了Java中的命名空间和包结构,并且还提到了注解和编码风格,似乎这一章想告诉你的是如何写好一个Java程序。

当然,作者在阐释每个概念时还是非常严谨和讲究的,比如介绍对象的内存分配的那一部分,只不过把这些内容串起来,组织成第二章,确实不太符合我们一般的看书习惯

显然,要这样一章章地把这本书给介绍完,有点记流水账的意思,所以一些我觉得比较不重要的章节,我们就一笔带过。

比如第三章:操作符、第四章:控制执行流程,这两章讲的东西大家学过c语言就不会陌生,无非就是加减乘除,位运算以及if else,for循环等等,然后就是第21章图形化界面,我们也跳过不介绍。

剩下的章节,好像没有什么可以跳过的了。好吧,那我们就把相关的章节放在一起介绍吧。

初始化和清理、权限控制

第五章:初始化和清理,主要介绍的就是类的构造方法、初始化方式以及垃圾回收,初始化让对对象生成,而垃圾回收则用来销毁对象。

第六章:访问权限控制,主要讲了Java中的包、类之间的关系以及如何控制类之间、包之间的访问条件,我们都知道Java中有四个访问权限的关键词:public、default、protected和private,分别对应着四种访问权限。

复用类、多态、接口

复用类的这个章节讲述了Java实际编程中常常要面对的继承、组合的问题,继承提高复用性,支持多态,而组合可以解耦,让代码更加灵活。很多时候,继承和组合是可以一起使用的,并且这也很合理。

这里还提到了代理的概念,代理是结合继承和组合的另一种折中的方式,一般来说还可以分为动态代理和静态代理,而书中提到的是静态代理。

再来看看多态的这个章节,多态其实是基于继承来实现的,由于继承关系的存在,子类可以表现出父类的所有特性,于是父类的引用可以指向子类的对象,并且执行父类的所有方法。

这样的好处就在于,你可以在某个方法里通过父类引用来接收所有了子类对象,比如一个方法叫做eat(Fruit f)意思是吃水果,我们可以传入的对象除了Fruit之外还有Apple、Peach等对象,前提是它们都继承了Fruit。

Fruit fruit = new Apple();

这就是一种向上转型的应用。

当我们要把父类引用转成子类引用时,我们需要保证这个对象确实是属于这个子类的,比如这个例子

Apple apple = (Apple)fruit
这里使用的就是强制转型

当然,我们不能把Apple转成Peach。

Fruit fruit = new Apple();
Peach peach = (Peach)fruit
这样的话就会抛出类型转换异常啦

这个例子其实就是对多态的最好解释了。接下来再看看接口

继承代表的关系是is a,组合代表的关系是has a 而抽象类和接口则进一步完成了抽象的升级。

比如有一个抽象类叫做Animal,animal是动物的统称,它本身不应该被实例化,但是它的子类,阿猫阿狗都可以被实例化,而抽象类本身可以实现动物都有的一些公共方法,比如都会吃,都会生老病死。

这就是形容抽象类最好的一个例子了,而接口是什么,接口比抽象类还要更加抽象,它可以表示一种特征,而这种特征,比如“有女朋友”是一种特征,那么我们可以声明一个接口叫做“有女朋友”,有女朋友的你们就可以实现这个接口,而这个接口通常会有一些抽象方法,你必须要实现它,比如“约会”、“逛街”、“买单”等等。

而单身狗就不需要实现它了,因为你们不配实现这个接口2333。

内部类、持有对象

内部类其实一直都是Java里面一个非常有特色的的实现,我们平时用的不一定多,但是其本身是很有用的。

比如我们想让一个类随时访问某个类时,就可以使用内部类,比如一个叫做显卡的类,可以是属于计算机这个类的内部类,此时显卡可以访问计算机的所有属性和方法,这样的设计就非常合理。

而内部类还分为静态内部类和非静态内部类(也就是普通内部类),静态内部类和外部类其实是毫无关系的,只不过相当于在外部类名下挂牌了而已,比如一张纸放在桌上,这张纸就可以理解为是桌子这个类的静态内部类,虽然两者没啥关系,但你要访问这个类的时候就得用桌子.纸张()这样的方式来获取它。

第二部分,关于持有对象的内容,其实主要讲的是集合类如何持有对象的,事实上,如果从内存分配的角度上看,容器里只会存放对象的引用,而不是对象本身。

异常

一般来说,代码的错误应该在编译期就被发现,但实际上,它们可能会在运行时才被发现,这个时候我们就需要引入异常处理机制,而Java的异常处理机制允许你把异常处理和功能代码分开,使用try catch语法和Exception对象,就能够处理掉绝大部分的Java异常,这是非常方便和使用的。

字符串、类型信息

字符串也就是String类最大的特征就是不可变,因为它是被声明成final类型的,一旦string对象生成在堆上,它就不会变改变了,当然,string引用本身是可以改变的,它可以指向其他的string对象。

这一章节的内容主要就是介绍了string的一些常用方法和相应的用法。

这部分内容其实讲的是运行时类型信息和反射,JVM通过Class对象来描绘和存储一个类的运行时信息,可以通过这个对象来获取它信息,一般来说我们可以通过反射获得这个类和对象的运行时信息,比如方法、域,我们也可以通过反射完成对象的实例化、方法的调用,这帮助我们在运行期完成很多事情。

泛型、数组、容器深入研究

没想到本书把泛型的章节介绍得这么细致,一般来说,讨论泛型讨论的就是几个问题,一个是泛型的使用,我们可以在方法和类声明中使用泛型,然后我们需要了解泛型的擦除机制。

另外有两个和泛型的常见机制,就是泛型的通配符以及边界,我们可以通过?来作为泛型的通配符,并且使用extends来定义的上边界。

没想到小小的数组都能占到如此大的篇幅,本书确实把很多细节都挖的很深。

这部分内容承接上面关于集合类内容的介绍,主要介绍了集合类的一个整体框架,并且把一些实现细节和实用方法都做了一下介绍,并且引出了Java中的几种特殊引用:软引用、弱引用和虚引用。

Java IO系统

JavaIO系统是Java中很重要的一部分内容,只不过有时候我们用的并不多,如果我们很少操作文件或者进行网络编程的话,对于IO的接触可能不会太多,当然,要理解后面的网络编程,这部分内容还是必须要掌握的。

枚举类型、注解

一个小小的枚举居然也有这么多内容,其实我们平时就是用它来代替常量而已,比如星期一到星期日就可以做成一个枚举叫做WeekDayEnum。

注解的部分其实应该和反射放在一起比较好,因为我们通常都要使用反射来获取注解,很多时候注解不止是让我们看的,而是能确实起到作用的,如何起到作用呢,那就是要使用反射了获取注解,然后进行相应的处理了。

比如我在一个类上写了注解@Log(“controller”)我们可以通过反射获取所有这个注解的类,然后执行相关方法时打印controller日志,以达到通过注解来实现日志统一打印的功能。

并发

终于来到最后一部分的并发了,我们平时了解的并发其实就是多线程、线程池,然后就是JUC的并发包,以及同步和加锁等机制,并发的内容其实包括很多,有兴趣的话需要专门找一本并发编程的书籍来看看,比如《Java并发编程实战》。

我的读后感

整体来看,本书追求的是综合性,专业性和权威性,力图把每个知识点都用严谨的文字来介绍,但是可能对于易读性和读者的阅读体验考虑稍有欠缺。

大部分人没有耐心读完本书(我也一样)是因为本书内容的篇幅过长,而且阅读难度较高,有种在读学术论文的感觉,基本上找不到任何接地气或者是生动有趣的描述,和隔壁《head first Java》形成鲜明对比,如同一个严谨和学究和一群有趣的年轻人一样,是你你会如何选择呢。

也许在你钻研每个复杂的知识点时,本书可以更好地帮助到你,前提是你能够接受作者的语言风格,如果你想要轻松愉快地学习和入门Java,那么有更多适合新手的书籍等着你去探寻。

-----------------------

公众号:程序员黄小斜(ID:AntCoder

博客:www.how2playlife.com

知乎:程序员黄小斜

B站:黄小斜(求关注)

致力于让更多人更轻松地自学编程,授人以鱼也要授人以渔

关注微信公众号【程序员黄小斜】回复“2019”领取我这两年整理的学习资料

涵盖自学编程、求职面试、Java技术、算法刷题、计算机基础和考研等8000G资料合集。

史上争议最大的一本Java书籍,到底值不值得我们一读?相关推荐

  1. 这可能是史上功能最全的Java权限认证框架!

    点击关注公众号,Java干货及时送达 今天给大家推荐的这个开源项目超级棒,可能是史上功能最全的 Java 权限认证框架! 这个开源项目就是:sa-token . Sa-Token是什么? sa-tok ...

  2. 这可能是史上功能最全的 Java 权限认证框架!

    点击关注公众号,回复"1024"获取2TB学习资源! 今天给大家推荐的这个开源项目超级棒,可能是史上功能最全的 Java 权限认证框架! Sa-Token 介绍 Sa-Token是 ...

  3. 史上最难10道Java面试题!

    点击上方"朱小厮的博客",选择"设为星标" 回复"1024"获取独家整理的学习资料 这是我收集的10个最棘手的Java面试问题列表.这些问题 ...

  4. 【微信小程序】史上最全的《Java面试题及解析》,理论+实战双管齐下!

    前言 Spring 5 于 2017 年 9 月发布了通用版本 (GA),它标志着自 2013 年 12 月以来第一个主要 Spring Framework 版本.它提供了一些人们期待已久的改进,还采 ...

  5. 史上讲的最好的Java NIO与IO的区别与应用

    如果下面的内容看的不太懂,直接看最后的摘要和总结. 在研究Java NIO和IO API时,很快就会发现一个问题: 我什么时候应该使用IO,什么时候应该使用NIO? 在本文中,我将尝试阐明Java N ...

  6. 史上最难的一道Java面试题

    点击上方"架构师小秘圈",选择"置顶公众号" 第一时间关注架构师方面的技术干货 无意中了解到如下题目,觉得蛮好. 题目如下 public class TestS ...

  7. 史上最详细版!java文件打包成exe,在未配置安装JDK和未配置的电脑上运行--转载...

    原文地址:http://funine.iteye.com/blog/2220359 (本文所有素材将在文章最后附上) 准备工具exe4j, converticon.com(用于制做.ico格式的图片) ...

  8. 史上最全的中高级JAVA工程师-面试题汇总

    了解博主本人,请阅读<成就一亿技术人,我在CSDN的这九年> 文档下载地址: https://download.csdn.net/download/shengqianfeng/120804 ...

  9. 史上最全的主流java开发工具(一)

    声明:为了让大家能有兴趣看下去.我们尽量把文章缩短,分成几篇来发布. 要想编写程序,需要一个能编写源代码的编辑工具.常用源码编辑工具 一.java初学者常用源码编辑工具介绍 java源代码本质上其实就 ...

最新文章

  1. HTML 特殊符号编码对照表
  2. 鸿蒙系统正式开源,余承东:鸿蒙系统正式开源,友商也可以使用!
  3. JavaScript-Date日期对象
  4. 垃圾回收器如何确定哪些对象要回收---《深入理解java虚拟机》
  5. 求解集合A与B的差集
  6. GCC编译静态库和动态库
  7. Exception.ToString()使用及其他方法比较
  8. 使用AXI Verifcation IP进行系统验证
  9. maven中如何打jar包
  10. 读xml文件时字体串类型的判断
  11. Android 开源项目及库汇总
  12. idea2018破解码
  13. 在【使用QNX Momentics IDE构建的(只读QNX系统)】中搭建SSH方法
  14. debian笔记本电源管理
  15. Win10登陆界面卡住,进去后无法打开网络相关的设置,谷歌浏览器无法上网
  16. 【Axure】web端数据可视化设计(数据统计,数据大屏)
  17. 借助Jackson的JsonTypeInfo注解实现多态类的解析
  18. 软考(软件设计师)下午题 第二题
  19. python中frame是什么意思_python-Tkinter中的Frame类的目的是什么?
  20. L2-039 清点代码库

热门文章

  1. 域名该怎么玩?域名玩法介绍
  2. 使用Mybatis查询,返回时间数据没有时分秒 解决方法
  3. 利用python来自己写一个服务器台账统计小工具
  4. css3之制作个性照片墙
  5. Oracle内存管理(修改SGA与PGA)
  6. 计算机究竟是怎么跑起来的
  7. zigbee 源码 03-烟雾传感器MQ-2
  8. 解码“认知之轮”:AI与人类的终极一战
  9. Web前端程序员的职业方向定位
  10. 达内java第一个月月考_为什么我努力了一个月,月考成绩却更低了?