01 为什么要学习Java

因为热门。这是对于为什么要学习Java的非常热门的一种回答,当然,可能没那么直白。也许在很多人眼里,2020年还问为什么要学习Java,这个问题本身就很奇怪。

当前Java流行到了什么地步呢?看编程语言排行榜的前三名。不过看的不是Java是否在前三甲之内,而是将Java作为一个重要的指标,判断这个排行榜有没有参考价值。Java就是这么豪横。

如果要说原因,原因之一就是热门。对于编程语言来说,热门非常重要,应该说,一门编程语言的热门程度和重要程度,是互为因果、相互促进的两个因素。我想很多同学应该和我一样,在刚接触编程语言的时候,总想找一门“厉害”的编程语言来学,总爱问这门语言好不好,或者这两门语言哪个好。就好比我们想成为武林高手,总想在正式练武之前,搞清楚哪家才是最高的武林绝学。

不过,至少在编程语言这一方面,情况与武侠世界略有不同。对于什么才是最好的编程语言,哪款才是最好的编程语言之类的问题,大家很爱讨论,但同时也很难有一致的结果。就我个人来说,热门是评判编程语言“好”或者“不好”的一项很重要的指标。值得学的编程语言,本身应该是一款热门的语音。

没错,编程语言和网络游戏有个地方很像,热门可能比游戏本身更为重要。用的人多,对编程语言来说,这本身就是一种“厉害”。

这么说好像很浅薄,但请仔细想一下,学编程的最终目的不是学会编程,而是能够通过编程解决问题。那热门的编程语言有什么好处呢?用的人多,开发出来的各种趁手工具就多,也就是“库多”,更重要的是,用的人足够多了,你着急想要解决的问题,可能前面已经有人遇到并且解决了,已经有了很好用的库,那么,本来可能需要你费力写一堆代码才能解决的问题,现在只需要简单调用一下就可以完成,解决问题的成本一下降到了几乎可以忽略不计。这就是为什么有些库用起来会非常爽,甚至让人感觉有点相见恨晚。

同时,这也是个正向循环。解决问题的成本低,所以会有更多的人愿意选择用这门语言解决问题,贡献出更多解决各类问题的库。这个就是编程语言的所谓生态环境,很多初学者感觉到很奇怪,为什么现在的公司都放着各种崭新的编程语言不用,非要用一些“爷爷级”的编程语言,其中项目的延续性是很重要的一部分原因,但同样也有生态环境的考虑,最起码的是,你要选用某个编程语言做项目,首先你得在人才市场上招到足够的开发人员吧。

那么回到Java,现在软件开发大量使用Java,Web后端服务、Android移动应用等等能够容纳大量开发人员的项目,第一选择、甚至唯一选择就是Java。Java热门,所以整个软件开发行业十分依赖Java,而又正因行业依赖Java,所以Java十分热门。因此,不管你出于什么目的学习编程语言,追求技术也好,追求就业也好,Java就算不是排在你的学习列表的第一位,也一定是个“虽迟但到”的角色。

02 面向对象革命

不过,这还远不是全部的答案。

Java也不是从诞生就热门的,下面聊聊Java尚未热门的阶段。那么问题来了:Java是依靠什么,能够最终犁庭扫穴,最终成为一门热门的编程语言呢?

这就要从编程语言史上的一次具有划时代意义的革命,面向对象革命说起了。什么是面向对象呢?先说下“双十一”:双十一在成为全民狂欢的购物节之前,只是一个供单身人士流泪的小众节日。在程序员的社交圈里子,双十一经常会发生以下对白:

“祝你节日快乐!快祝我也节日快乐。”

“对不起,我不过节了。”

“什么!你居然能有对象?你这个冒牌程序员!”

“你才是冒牌程序员,不过是区区对象,只要new一下要多少有多少。”

这是个程序员才能看懂的梗,这个梗就是来自于面向对象编程(OOP,Object Oriented Programming)。对于Java来说,面向对象至关重要,随便翻开一本介绍Java的编程语言教材,作者一定会选择在最为显著的位置,大张旗鼓介绍面向对象编程。可以说,当年寂寂无名的Java最终能够逆势崛起,靠的正是面向对象编程。可能你说不对,当时面向对象编程可是有好几家,其中有一家还是很有精神的C++老大哥,为什么最终是Java笑到了最后呢?答案是:纯粹。C++虽然是面向对象编程,但选择了“和稀泥”,而Java这边则立了一个当时来看很极端的人设,叫“众生皆对象”,100%纯面向对象编程语言,最终顺应编程发展的新潮流,赢下了更多的市场。

现在面向对象早已成了业界标配,以至于许多新学者将面向对象当作编程语言理所应当的组成部分。介绍面向对象编程的教程,更愿意把章节安排给名词介绍,诸如什么是继承、什么是多态、什么是类、以及前所说的什么是对象。这些当然都是面向对象编程中的重要元素,但是,光知道这些名词,很难反推为什么现代软件开发中需要这些名词。

其实,面向对象编程作为一种编程思想,经历了漫长而曲折的发展,与其说是Java最终占据了软件开发的主流,不如说是面向对象编程思想最终占据了主流。在此之前,人们普遍采用的是另一种编程方法,称为“面向过程编程,这种方法更为符合程序员的直觉,使用非常广,而面向对象革命,革命的对象就是面向过程。要讲清楚面向对象编程为什么重要,首先就要从什么是面向过程编程讲起。

我一直怀疑,“面向过程编程”这个拗口的术语,是研究人员在发明了面向对象编程思想以后,为了进行对比和区别,才专门设计出来的。“过程”这个词太过于笼统暧昧,很难单从字面意思上推断它想表达的意思,很多教程对此也含糊不清。按我的理解,面向过程编程其实我们小时候玩的填空游戏非常相似:我们手头上有三样东西,一堆数字、几枚运算符和一个结果,现在我们要做的就是找到一个顺序,将这堆数字和运算符按顺序拼接起来,使得最终的运算结果和给定的结果一致。这个顺序,就是所谓的“过程”。

可以看出,面向过程的编程方式,是要求我们以CPU的视角看待问题,从哪里读入数据、存入什么数据结构、经过哪些运算、调用哪些函数,我们需要苦思冥想,找到一个合适的顺序将这些组合起来依次执行,最终得到想要的结果。

我相信,大多数人学习编程,都是从面向过程的编程方法开始的。现在有很多的趣味编程游戏,给出各种数值和运算模块,你只要做的就是将它们组合起来,输出目标数值,就能通关得分,这类游戏背后就是典型的面向过程编程思想。这就是为什么我说,面向过程编程更符合程序员的直觉。相信很多习惯了面向过程编程的同学转面向对象编程时,会有那么一种感觉,表达同样的意思,使用面向对象时代码量总要多一些,不那么清爽直接。

那面向过程编程现在被面向对象编程取代,是不是它有什么不好呢?在计算机世界里,很少有绝对的好或不好,只有“合适”,在特定的背景环境下,优势就会变成劣势。面向过程编程符合直觉,是因为采用了CPU作为解决问题的主要视角,可是,当你采用CPU视角来描述问题的时候,可能就容易捉襟见肘了。以一个老师经常布置的作业为例:编写图书管理系统。图书管理系统里面包含了各种过程,譬如借书过程、还书过程、新增书籍登记过程等等,但是,这些看似彼此互不相关的过程背后,实际是存在着某种逻辑关联的,它们都是图书管理系统里的各种角色,譬如说图书、借书者、管理者等等,是这些角色之间的各种关系和互动所产生的。

如果你采用的是面向过程编程的方法,你更关心的可能是另外两个角色,数据定义和函数设计,那么,你要做的主要工作有两样,首先是翻译,将图书管理系统的种种功能问题转化成CPU视角下的各种问题,然后才能着手开发。不难看出,从这个视角看问题,总是免不了要先绕一圈。

那更好的办法是什么呢?那当然是面向对象编程

既然是角色之间产生的各种故事线,那我们直接就以角色,也就是对象的视角看待问题,这样我们的设计逻辑反而更加简单直接,符合实际。在我看来,面向对象编程是一种描述问题的方法,我们不是为了对象而对象,而是因为用了对象,整套设计将更有条理。不仅如此。大家很快发现,采用面向对象编程,不仅思维更加清晰,很多软件工程的方法也能得到更好地体现和实践,所以最终的结果就是面向对象编程现在占据了软件开发的主流。

03 并不专一的Java虚拟机

Java当初推出来的时候,主打两个卖点,第一个就是上面所说的100%纯面向对象编程,另一个则是一条喊得很响亮的口号,叫“一次编译,到处执行”。这是个非常美好的愿望,我想程序员的新年愿望除了世界和平以外,说的最多的应该就是这个。

不过,既然是很多人的愿望,就说明这个问题很困难。别看这个口号好像云淡风轻,但从程序的角度看,不同的平台、不同的系统甚至不同的环境之间都有着太多的不同,有些是运行起来各种报错,有些干脆就没法运行。以前为了应对这些不同,只好一对一服务,需要另行编写专门的代码,有时甚至相当于从头编写另一套程序,也就是业内所说的移植难度高,这就抬高了软件开发的成本。

那Java怎么解决这个问题呢?

很简单,找个“中间人”。“中间人”不但可以赚差价,也可以承上启下。具体的做法是,在Java和系统环境之间嵌入一款虚拟机,名字就叫“Java虚拟机”,一般写作JVM。这样只需要为每种环境开发适配的虚拟机,而虚拟机自身是按照相同的功能标准设计,这就能保证Java程序在相同的环境中运行,也就实现了“一次编译,到处执行”这个看似高不可攀的目标。所以,大家要运行Java环境,首先要做的就是安装当前系统对应的Java虚拟机。

大家可能一看“虚拟机”这三个字,想到的可能是VMware之类的虚拟机软件,感觉Java采用虚拟机方案虽然好,但很复杂、很占资源。其实,虚拟机有很多种,除了VMWare这种软件级的虚拟机,还有系统级的虚拟机,也就是运行在操作系统之下的虚拟机。而Java虚拟机虽然也叫虚拟机,但又和这两种不同,术语叫高级编程语言虚拟机((High-Level Language Virtual Machine,HLL VM),是一种专门设计用于给高级编程语言提供运行环境的虚拟机,最直接的作用就是提高程序的可移植性。

另一个大家容易疑惑的地方在于,Java那到底属于编译型语言,还是解释型语言。我们有一段很爱争论这个,而且都觉得自己特别占理。你说Java是编译型语言吧,它用了虚拟机,可你说它是解释型语言,人家又明明白白说了“一次编译到处执行”。

现在回头来看,我们都有点太教条。Java的源码并不是直接放到虚拟机中就可以执行,而是需要首先经过编译器,从源文件编译成字节码文件,然后放入虚拟机才能执行。这个字节码相当于Java虚拟机的机器指令,你非要说Java虚拟机是解释执行,这也没错,很多人说Java运行效率低,原因就在于Java虚拟机是解释执行。但你再想,这个虚拟机它解释执行的不是源码,而是编译后的字节码,从这一点看,好像又有点不太一样。现在的问题更复杂了,Java虚拟机采用了JIT技术,不再是纯解释执行了,而新版本的Java居然已经可以像解释型语言一样直接运行源码,各种特性混在一起,对部分人来说不够友好。我倒是觉得,纠结分类其实没什么必要,根据不同的应用场景选择最合适的方法才最重要。

不过,Java虚拟机执行字节码这个设计带来了意外的惊喜,Java的虚拟机和字节码均有公开的规范文档,第三方只要按照相同的标准实现字节码编译器,就能低成本地开发出一款能够在Java虚拟机上运行的编程语言。现在已经出现了一批这样的JVM编程语言,知名度比较高的包括Kotlin、Scala、Clojure和Groovy,这些后起之秀不需要背负Java沉重的历史包袱,而且设计思想更为先进,得到了越来越多的认可。

04 怎样学习Java

Java是一门编程语言,最佳的学习方法当然是多动手写代码,当然,大家肯定也需要读一些教材。Java已经经过多年的发展,教材非常多,业界公认的经典例如:《Java编程思想》、《Java核心技术》、《Effective Java》、《深入理解Java虚拟机》等等。

这几本书都很经典,非常值得一读。《Java编程思想》是几乎所有Java使用者都推荐要去读的一本书,这本书的特点是偏重思想,很多书会告诉你这个功能怎么用,《Java编程思想》不但告诉你怎么用,还告诉你为什么要这样用,背后的思想是什么,读完以后让人醍醐灌顶。而《Java核心技术》偏重应用,从编程环境的配置讲起,将Java方方面面的功能特性都进行了十分详尽的介绍,完全可以当成Java产品使用说明书来使用。

如果你是新手上路,对Java并不熟悉,我推荐的阅读顺序是先从《Java核心技术:卷I》读起,这本书相当于Java的新手教程。当你对Java积累了一定的使用经验之后,再阅读《Java编程思想》,会有一种知其然又知其所以然的酣畅感觉。

对于爱好底层,想要深入了解Java虚拟机的同学,我推荐阅读周志明的《深入理解Java虚拟机》,这是一本专门介绍JVM技术的书。JVM对Java来说很重要,Java程序的最终运行靠的就是JVM。很多介绍Java的书籍会顺带介绍JVM,譬如垃圾回收机制,内存分配机制,但JVM发展到现在,内部结构相当复杂,就连看似简单的垃圾回收也已经演进了好几个世代,很多内容,包括Java源码编译之后产生字节码,展开都是很大的篇幅,想要真正了解JVM的内部结构和运行机理,目前《深入理解Java虚拟机》应该是最好的选择。

如果,你已经掌握了Java基础的核心技术,那么就一定要看《Effective Java》这本书。这是一本分享经验与指引你少走弯路的经典著作,针对如何编写高效、设计优良的程序提出了最实用、最权威的指导方针,是Java开发人员案头上的一本不可或缺的参考书。

最后再补充一下虚拟机技术。我们日常接触最多的应该是应用层的虚拟机,前面说过,虚拟机技术远不止于此。不过,也正由于虚拟机技术应用广泛,相关的内容都是分散在其它技术之中,如果想要进行专题了解,除了看《深入理解Java虚拟机》,还可以去淘一本老书《虚拟机:系统与进程的通用平台》。

点击链接了解详情并购买

作者简介:

莫凡,娱乐向机器学习解说选手,《机器学习算法的数学解析与Python实现》作者,前沿技术发展观潮者,擅长高冷技术的“白菜化”解说,微信公众号“睡前机器学习”,个人知乎号“木羊”。

更多精彩回顾

书讯 |9月书讯(下)| 开学季,读新书

书讯 |9月书讯(上)| 开学季,读新书

资讯 |TIOBE 9 月编程语言:C++ 突起、Java 流行度下降

上新 | 一本书带你吃透Nginx应用与运维
书单 | 开学季——计算机专业学生必读的10本畅销经典

干货 | 用户画像从0到100的构建思路

收藏 | 更新!更薄!更精华:《JavaScript编程精解》来了

视频 | 大佬出镜推荐不可不读系列——程序员陈彼得

赠书 |【第22期】网络安全在身边|最强学习书单整理

点击阅读全文查看更多好书

聊聊Java那些事儿相关推荐

  1. 《开源者说》08期:聊聊Java那些事儿

    <开源者说>08期:聊聊Java那些事儿 发表于2015-06-10 18:23| 4388次阅读| 来源CSDN| 28 条评论| 作者陈秋歌 Java开源者说 陈阳宫力许斌 摘要:20 ...

  2. Java自动装箱/拆箱 - Java那些事儿

    昨天Java基本数据类型和引用类型一文中漏了几张图,已经补上,需要的自己回头去看,本系列文章首发于公众号:saysayJava. 在让人疑惑的Java代码 - Java那些事儿 一文中我们说到编译器自 ...

  3. String是一个很普通的类 - Java那些事儿

    上一篇我们讲了Java中的数组,其实是为本章的内容做准备的,String这个类是我们在写Java代码中用得最多的一个类,没有之一,今天我们就讲讲它,我们打开String这个类的源码: 声明了一个cha ...

  4. gc java root_聊聊Java的GC机制

    原标题:聊聊Java的GC机制 近日,MIUI在小米全球社区发布公告,表示MIUI将在全球市场销售的手机中预装谷歌拨号及谷歌消息应用程序(中国.印度.印度尼西亚等市场除外).小米表示,小米9T Pro ...

  5. java整段标记_聊聊JAVA GC系列(7) - 标记整理算法

    在介绍"平平无奇"的标记清除算法时, 还留下了另一个问题, 就是内存碎片的问题. 内存碎片的问题是指, 每次回收的内存都是比较分散的, 可以加起来是一个比较大的数值, 但是由于可用 ...

  6. java 获取泛型_聊聊Java泛型擦除那些事

    >版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/89789849 出自:shushen ...

  7. 敞开心扉,一起聊聊Java多线程

    目录 敞开心扉,一起聊聊Java多线程(结尾有福利~) 一.线程的实现方式 1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法 3.实现Callable接口重写run ...

  8. 深情留不住,套路得人心- -聊聊套路那些事儿

    本文来自网易云社区 作者:朱蕊 本文来自于朱蕊在网易实践者沙龙分享[深情留不住,套路得人心- -聊聊套路那些事儿]的文字记录,全文7000字,阅读完成大概需要7分钟. 下午好~很高兴今天能跟大家一起来 ...

  9. 聊聊Java中的泛型

    聊聊Java中的泛型 文章目录 聊聊Java中的泛型 参考资料 一.概述 1. 泛型的定义 1.1 定义 1.2 常见形式 2. 为什么需要泛型 3. 泛型的优点 4. 泛型的使用 4.1 泛型类 4 ...

  10. java stw_聊聊JAVA GC系列(6) - STW

    上回介绍了"平平无奇"的标记清除算法却是JAVA GC的灵魂, 介绍的过程中留下了几个问题, 其中一个问题是: 标记清除算法正在运行时各个对象的依赖关系发生了变化怎么办? 我们先假 ...

最新文章

  1. [微信小程序]提交表单返回成功后自动清空表单的值
  2. android authtype=1,【报Bug】plus.screen.lockOrientation在android里引起闪退
  3. Session为null 问题
  4. ftp网页版服务器地址,免费ftp服务器地址汇总
  5. 用万网云虚拟主机搭建一个自有域名的WordPress博客
  6. 关于YUV格式的一些总结
  7. 匈牙利算法求最大匹配
  8. 为什么爬虫需要代理IP?
  9. 多图片上传,多文件上传。插件diyUpload.js
  10. html中js图标点赞,js实现简单点赞操作
  11. 第一部分 知己知彼
  12. 叙述两个计算机技术的应用,《计算机技术与应用基础》复习题附答案.doc
  13. GHUB LUA脚本 压枪脚本 推荐APEX用
  14. 普歌+阿里云视频点播错误修改
  15. 推荐算法(推广搜)——广告和推荐有什么不同?
  16. ajax从服务器获取图片,JQuery ajax与POST从CORS启用服务器获取图像/ png
  17. 不懂SEO该如何做搜索引擎优化?
  18. 【pwnable.kr】leg
  19. 诛仙手游服务器购买无限制,全新福利提升 摆摊amp;购买增加次数限制_18183诛仙手游专区...
  20. 阿里云入门级服务器和企业级服务器有什么区别?

热门文章

  1. java闪烁的星空_PS制作出闪烁的星空gif动态图
  2. 通过多视图信息瓶颈学习鲁棒表征
  3. 征途服务器文件,征途端游服务器地址
  4. tom 猫 android 版本 设计,一种Tom猫的简单实现
  5. Android中文件的读写---assets和raw下的资源文件
  6. 网络调试助手连接远程服务器
  7. 每日一题【62】导数-公切线问题
  8. (原创)[联觉][类比推理的应用]震惊!声音也有温度和冷暖?什么是冷声和暖声?无处不在的联觉,色彩、声音的频率与温度之间的通感,色彩和声音的冷暖(类比冷色和暖色)
  9. python中selenium关于滚动条的循环下拉滚动操作---滚动条操作
  10. C盘满了,要怎么清理才不会误删?