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

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

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

文/黄小斜

转载请注明出处

不管你是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资料合集。

发布了301 篇原创文章 · 获赞 1686 · 访问量 124万+

猜你喜欢

转载自blog.csdn.net/a724888/article/details/105002532