Why Java? Why not Java?
对的,没错,这是一篇记录笔者从零开始学习 Java 的博客,后面还会有更多关于 Java 的博客被记录。
关于 Java 学习过程中的那些基础知识,在这里就不过多的去介绍了,没什么意义,更多还是去聊一下面向对象或者一些新奇的东西。
既然是开篇之作,还是多写一点轻松的内容,其实就是还没有总结完。所以文本就简单写一下我对 Java 的认识吧。
我与 Java
关于 Java,应该是除了 C++ 之外我最先了解到的编程语言了,其实在大一上没结束的时候我就已经开始准备选择一个语言进行学习,为以后找工作打算了。
大一的我提起 Java,觉得不够有趣,选择 Python;大二的我提起 Java,嗤之以鼻,想着学了它,那我和大专的学生有什么区别;大三的我提起 Java,想到被 Go 语言的实习打击的惨样,悲从中来,后悔没有早点学。呜呜呜……
就像这个系列里的分类一样,我对 Java 的态度从”Java?狗都不学“ 到 ”Java!!!世界上最好的语言“。很抽象,但没办法。
不知道你有没有想过,世界上有那么多编程语言,每种语言都有自己的特性,为什么 Java 能如此流行,在各行各业都被广泛使用,兴趣才是学习的第一动力,所以还是应该先了解一下 Java 的历史和设计哲学。
Java 的诞生
计算机业内一般认为:B 语言导致了 C 语言的诞生,C 语言演变出了 C++,而 C++ 会被 Java 语言所打败。是什么导致了 Java 的诞生?想要解决这个问题,我们先来看看 Java 的前辈们。
C 语言的诞生
C 语言的产生是人们追求结构化、高效率、高级语言的结果,它可以替代汇编进行开发,它的出现改变了人们之前的编程方法和思路。
C 语言的出现解决了之前语言的各种不足,比如:FORTRAN 高效但不适用于编写系统程序。BASIC 虽然容易学习,但是功能不够强大。汇编高效,但是学习成本很大,且很难调试。
另外,C 语言之前的语言没有考虑结构化设计。它们大量使用 GOTO
语句来对程序进行控制。这样做的结果是程序极其混乱,各种跳转和条件分支交织在一起极大地影响了程序的可读性。人们解决该问题的愿望非常强烈,且日益迫切。20世界70年代初,计算机革命开始,人们对于软件的需求日益增加,使用当时的语言开发软件已经无法满足需求。人们在此期间进行了很多的尝试,但是没有发明出更好的语言。直到一个新机遇的到来:计算机硬件资源的富余。由于计算机硬件的增多,程序员可以随意的使用计算机,随意进行各种尝试,这就给了他们开发自己工具的机会。后来Ken Thompson (同样是 Go 语言之父) 发明了 B 语言,B 语言演化到了 C 语言。1989年美国国家标准化组织制定了 C 语言的标准,C 语言被正式标准化。C 语言是由程序员对编程实践的总结而发明出来的,它能够解决早期语言的种种缺陷。
C++ 的诞生
C语言被用的好好的,为何出现了C++呢?原因是C语言太复杂了。当一个工程项目达到一定规模之后,使用结构化编程方法,编程人员就无法对它的复杂性进行有效管理。20世纪80年代初期,许多工程项目的复杂性都超过了结构化方法的极限。为了解决这个问题,面向对象诞生了。面向对象的特性:继承,封装,多态是用来帮助组织复杂程序的编程方法。因此出现了C++,C++ 的产生是基于 C 的,它包含了 C 的所有特征,属性和优点。
Java出现的时机到了
在20世纪80年代末到90年代初,使用面向对象的 C++ 语言占主导地位。然而,推动计算机语言进化的力量正在酝酿。万维网(WWW)和Internet在随后的几年达到了临界状态,这就促成了编程的另一场革命。
Java 诞生
由于嵌入式系统的发展,人们对一种独立于平台的语言更加渴望,这种语言可以嵌入微波炉,遥控器等各种家用电器设备的软件。用作控制器芯片的CPU是多种多样的,但是C和C++只能对特定目标进行编译。比如某个CPU要编译C++代码,那么就要创建一个针对该CPU的C++编译器,而创建编译器是一项耗时耗长,耗资大的工作。为了解决这个问题,Gosling和其他人一直在开发一种可移植,跨平台的语言。该语言能够生成运行于不同环境,不同CPU芯片上的代码。经过不懈的努力,在1991年被James Gosling,Patrick Naughton,Chris Warth,Ed Frank和Mike Sheridan发明出来。第一版花了18个月。刚开始叫 Oak,于1995年更名为 Java。
有趣的知识:JAVA其实是印度尼西亚一座岛屿的名称,中文名也叫爪哇,因盛产咖啡而出名。据说许多程序设计师工作之余都喜欢来一杯热腾腾的香浓咖啡,,并从中得到灵感,JAVA的寓意是为世人端上一杯热咖啡,因此JAVA的logo就是一个热气腾腾的咖啡形状。
Oak正是由JAVA之父James Gosling领导的绿色计划(Green Project)中的产品,在1995年更名为JAVA,并在SunWord大会上正式提出了”Write Once,Run Anywhere”口号。岁月如流,转眼间距离第一个JAVA版本诞生到现在已经20多年的时间,通过下面的时间线,一起回顾那些年我们学习过的JAVA。
Java 流行
在万维网(WWW)出现之前Java处于有用、默默无闻的用于电子消费品编程的状态。然而由于万维网的出现,Java被推到了计算机语言的设计的最前沿,因为万维网也需要可移植的程序。
因特网是由不同的、分布式的系统组成,其中包含各种类型的计算机,操作系统和CPU。尽管许多类型的平台都可以与因特网连接,但是用户仍然希望他们能够运行同样的程序。
1993年,Java设计小组的成员发现解决嵌入式控制器可移植性的方法,也可以用来解决因特网的代码的可移植性问题。也就是Java不仅可以用来解决小范围的问题,也可以用来解决大范围的问题。这样他们将Java的重心由电子消费品,转移到Internet编程上。
Java 能够长久不衰的原因
从1995年在Sun World大会上的1.0版本正式提出“Write Once,Run Anywhere”到现在常年占据编程语言流行排行榜Top3,JAVA为什么能够如此受欢迎?下面我们就来盘点盘点!
面向对象编程
所谓面向对象指的是在进行程序开发时将应用程序的数据及操作方法封装成一个便于我们理解的”对象”的特性,使我们在开发过程能够更易理解、并实现信息的封装及模块化。
简单讲就是一个程序就可以被抽象成一个人,一个人会有两个眼睛、一个嘴巴等属性,可以有吃饭、行走等行为,程序也可以抽象成类似的属性和行为。
简单性
说一个东西简不简单其实是需要有东西对比才能够体现出来,了解或者学习过其他语言(如C++)的小伙伴就知道,JAVA中大体上语法和C++相类似,但是C++中一些比较难以理解、容易混淆的概念在JAVA中是没有的(如指针),JAVA是通过一种更清楚、更易理解的方式(即引用)来实现这些容易让人混淆的概念,所以对比起来就会感觉JAVA是更加简单的。
跨平台
跨平台指的是使用JAVA语言开发的程序能够运行在不同的软件平台和硬件平台上。 程序最终的执行是需要转成计算机硬件的机器指令来执行,而不同操作系统的、不同的计算机硬件是存在差异的,因此专门为某一种计算机硬件或者软件开发的程序直接放在另一个计算机硬件上是无法执行的(就像让大人穿小孩子的衣服,撑爆了也穿不进去),至少需要做移植操作,比如有些在Windows系统上编译的应用程序是无法直接拿到Unix系统上运行的。
想要解决这个问题,则需要程序语言不依赖于特定的操作系统或硬件,JAVA语言则正好满足这个条件,JAVA中引入了虚拟机概念,JVM实现了不同平台的JAVA接口,屏蔽了底层硬件的差异性,JAVA编译器将JAVA语言开发的程序编程成与计算机结构无关的字节码(也就是我们常说的class文件),只要安装了JAVA虚拟机,JAVA应用程序就可以在相应的环境下被执行。因此,Java 也有着“一次编译,到处运行”的顺口溜。
健壮性
何为健壮性:通俗理解含义是软件(程序)对于规范要求以外的输入能够判断出这个输入不符合规范要求,并能有合理的处理方式。 比如:一个字段取值只允许为数组和字母,但是用户却输入了中文,此时,对于规范以外(非数组和字母)的输入,程序需要能够作出合理的响应(如提示用户输入不符合规范),而不是直接报错或者无响应。
再举个通俗的例子:你到银行提款机取钱,但是输入密码后提款机就卡死了,该怎么办?这时候你可以请求柜员帮助,柜员可以理解为银行为异常情况提供了一个兜底方案,这时候你肯定会给银行好评,因为如果没有柜员,提款机卡死后你除了等待就无法做其他事情,想要拿回银行卡就可能需要等到银行派专门人来才行,这时候用户体验就会非常差,程序亦是如此。
使用JAVA语言编写的程序则具有这方面的特性。首先JAVA语言程序会在编译和运行时对可能出现的问题进行检查,减少因未知原因导致程序崩溃的情况。同时,JAVA语言提供了异常处理机制,它能够在编译时提示未被处理异常或者为运行抛出异常提供兜底方案,防止程序崩溃。
安全性
JAVA可以说是一种安全的网络语言,它屏蔽了指针类型,对内存的操作通过对象实例实现,同时,JAVA还在编译、解释层面进行了安全性的保证。
如:在编译层,JAVA会进行各种语法检测,不满足语法的写法在编译时报错无法被解释执行,在解释层,会对JAVA程序编译出来的字节码校验,同时还会进行代码段格式、类型转换是否合法等方面的检查,从而保障程序执行的一个安全性。
并发编程
随着科技的发展,人们对软件的使用体验有了更高的要求,响应速度就是其中非常重要的指标。JAVA内置了多线程的支持,通过多线程,计算机可以同时处理多个任务,因为处理器处速度远快于人接受信息的速度,人们会感觉软件的响应非常快,用户体验非常好。
可移植性
JAVA的可移植性主要与它的跨平台(平台无关性)有关,JAVA中的类库也实现了与平台无关的接口,从而具有了可移植性。JAVA的编译器也是使用JAVA语言编写的(源码可查看:JAVA编译器实现),解释器则是由标准的C实现,所以整个JAVA系统都具有可移植性。
动态性
JAVA中基础的单元就是类,类可以是开发者自定义,也可以是引用第三方定义好的类库,在JAVA中,类是运行时动态进行状态的,因此对类库添加新的属性和方法无序重新编译程序,这样JAVA就实现了动态维护程序和引用的类库。
而C/C++则是在编译时将相应的函数库或类库中使用到的类、函数生成机器码,如果后续类库升级如添加了新的函数,则C/C++程序想要使用类库中新增的功能,需要对程序进行重新修改、编译。
社区活跃度高、文档齐全
这个特点是得益于前面的描述的8个特点,正是因为JAVA语言有简单、跨平台等特性,才会吸引大量的开发者,社区的活跃度才会高,层层嵌套,所以JAVA才会流行至今。
总结
什么?你要学 Java?你为什么学 Java?
这是我的朋友们在知道我开始学 Java 之后问的最多的问题,在开始学之前,我们问了自己很多次这些问题。我为什么要从头开始学 Java?实在是现如今几乎所有公司都在使用 Java 这门语言,它好像一个无所不能的神,统治者国内的大小公司。
Go 语言绝对算得上目前为止我最喜欢得一个编程语言了,这一是我坚持学习时间最长得语言,但是找了三个月的实习,实在是太艰难了,大厂只有几家可以投,大多数科技公司都不会使用 Go 语言进行开发,小厂就更不用提了,所有的加在一起估计都没有 Java 的零头多。我毕竟不是一个理想主义者,还是务实一点的。
其实如果不是时间紧张,我应该也会对 Java 感兴趣,但是学习时间实在是太短了,而且暂时还没有找到很好的教程,只能像一个没头苍蝇一样到处乱撞。在更加深入学习之前,还是要先摆平心态。
本文到此就正式结束了,其实就是想说一下我要开始学 Java 了,最近几天要整理一下基础的知识点,在下一篇博客中记录。