目录
一、Java历史和版本
1.1 计算机语言的发展
所谓语言就是人与人之间沟通的工具,而计算机语言(Computer Language)简单来说就是人与计算机之间传递信息的媒介。计算机语言发展经历了机器语言,汇编语言,高级语言三代。
第一代语言:机器语言 (相当于人类的原始阶段)
机器语言由数字组成所有指令。当让你使用数字编程,写几百个数字、甚至几千个数字,每天面对的是纯数字,我大胆预测:“程序员群体100%会有精神问题”。
机器语言通常由数字串组成(最终被简化成01),对于人类来说,机器语言过于繁琐。使用机器语言,人类无法编出复杂的程序。如下为一段典型的机器码:
- 0000,0000,000000010000 代表 LOAD A, 16
- 0000,0001,000000000001 代表 LOAD B, 1
- 0001,0001,000000010000 代表 STORE B, 16
为了编程的方便,以及解决更加复杂的问题。程序员开始改进机器语言,使用英文缩写的助记符来表示基本的计算机操作。这些助记符构成了汇编语言的基础。如下是一些常见的汇编语言助记符(单词)比如:LOAD、MOVE之类,这样人更容易使用了。识别几百、几千个单词,感觉要比几百几千个数字,美妙多了。汇编语言相当于人类的手工业社会,需要技术极其娴熟的工匠,但是开发效率也非常低。
汇编语言虽然能编写高效率的程序,但是学习和使用都不是易事,并且很难调试。另一个复杂的问题,汇编语言以及早期的计算机语言(Basic、Fortran等)没有考虑结构化设计原则,而是使用goto语句来作为程序流程控制的主要方法。这样做的后果是:一大堆混乱的调转语句使得程序几乎不可能被读懂。对于那个时代的程序员,能读懂上个月自己写的代码都成为一种挑战。
汇编语言仍然应用于工业电子编程领域、软件的加密解密、计算机病毒分析等。
对于简单的任务,汇编语言可以胜任。但是随着计算机的发展,渗透到了工作生活的更多的方面,一些复杂的任务出现了,汇编语言就显得力不从心(应该说是程序员使用汇编语言解决复杂问题出现了瓶颈)。于是,出现了高级语言。像我们熟知的C、C++、Java等等都是高级语言。
高级语言允许程序员使用接近日常英语的指令来编写程序。例如,实现一个简单的任务:A+B=C , 使用机器语言、汇编语言和高级语言的的实现如下图1-2所示。
![]() |
三代计算机语言的直观对比 |
从上面这个简单的加法计算,可以看出越到高级语言,越接近人的思维,人使用起来就越方便。
高级语言的出现,尤其是面向对象语言的出现,相当于人类的工业社会,高级语言极其易用,编程门槛和难度大大降低,大量的人员进入软件开发行业,为软件爆发性的增长提供了充足的人力资源。目前以及可预见的将来,计算机语言仍然处于“第三代高级语言”阶段。
1.2 常用编程语言介绍
2021年11月份,Tiobe发布了最新一期编程语言欢迎度榜单,其榜单根据互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube统计出排名数据。
C语言
诞生于1972年,可以称之为现代高级语言的鼻祖,由著名的贝尔实验室发明。C语言是人们追求结构化、模块化、高效率的“语言之花”。在底层编程,比如嵌入式、病毒开发等应用,可以替代汇编语言来开发系统程序。在高层应用,也可以开发从操作系统(Unix/Linux/Windows都基于C语言开发)到各种应用软件。
C++语言
作为C语言的扩展,C++是贝尔实验室于80年代推出的。C++是一种混合语言,既可以实现面向对象编程,也可以开发C语言面向过程风格的程序。
C语言让程序员第一次可以通过结构化的理念编写出易于理解的复杂程序; 尽管C语言是一个伟大的语言,但是程序的代码量达到30000行以上时,程序员就不能很好的从总体上把握和控制这个程序。 因此,在80年代初期,很多软件项目都面临无法解决的问题而不能顺利进行。 1979年,贝尔实验室发明了C++。 C++最初的名字叫做“带类的C”,后来才改名叫C++。国内通用叫法:“C加加”,国际通用读法“C plus plus”。
C++语言在科学计算、操作系统、网络通讯、系统开发、引擎开发中仍然被大量使用。
Java语言
由美国SUN公司(被oracle公司收购)发明于1995年,是目前业界应用最广泛、使用人数最多的语言,连续多年排名世界第一,可以称之为“计算机语言界的英语”。
Java广泛应用于企业级软件开发、安卓移动开发、大数据云计算等领域,几乎涉及IT所有行业。关于Java的发展历史和特性,将在后面专门介绍。
C#(c sharp)语言
C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。C#在基于windows操作系统的应用开发这一领域在取代C++,占据主导地位。“成也萧何败也萧何”,C#的微软身份,也成为了发展的阻力,在其他IT领域应用较少。
Python语言
Python发明于1989年,语法结构简单,易学易懂;Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。Python广泛应用于:图形处理、科学计算、web编程、多媒体应用、引擎开发;尤其是在未来大热方向机器学习和人工智能上有非常大的潜力。
JavaScript语言
JavaScript是一种脚本语言,已经被广泛用于Web应用开发;应用范围越来越大,重要性越来越高。目前,流行的H5开发的核心其实就是JavaScript语言。
PHP语言
PHP原始为Personal Home Page的缩写,已经正式更名为 "PHP: Hypertext Preprocessor"。PHP语言,一般用于WEB开发领域;大量的中小型网站以及某些大型网站使用PHP开发。
Object-C和Swift语言
Object-C通常写作Objective-C或者Obj-C或OC,是根据C语言所衍生出来的语言,继承了C语言的特性,是扩充C的面向对象编程语言。OC主要用于苹果软件的开发。
Swift苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与OC共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序。
Kotlin语言
Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发。Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。
Kotlin已正式成为Android官方支持开发语言,并且是一种可以兼容java的语言。
Go语言
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
Basic语言
虽然易学,但功能不够强大,应用到大程序的有效性令人怀疑。已经逐步退出历史舞台。
COBOL语言
于1959年提出。主要用于大量精确处理数据的商业领域中,比如金融、银行。今天,仍然有超过一半的商业软件使用COBOL编写。有将近100万人使用COBOL编程。
Fortran语言
世界上第一种高级语言, IBM公司在1954年提出的,主要用在需要复杂数学计算的科学和工程领域。现在仍然被广泛使用,尤其是工程领域。Fortran虽然适合编写科学计算方面的程序,但是不适于编写系统程序。
Pascal语言
Pascal名称是为了纪念十七世纪法国著名哲学家和数学家Blaise Pascal而来的,它由瑞士Niklaus Wirth教授于六十年代末设计并创立的。Pascal语言语法严谨,层次分明,程序易写,可读性强,是第一个结构化编程语言。由于没有大厂商和政府的支持,只是限于大学教育这一块。
1.3 Java历史
1991年,Sun成立了一个称为Green的项目小组,专攻计算机在家电产品上的嵌入式应用。由于C++所具有的优势,该项目组的研究人员首先考虑采用C++来编写程序。但对于硬件资源极其匮乏的单片式系统来说,C++程序过于复杂和庞大。另外由于消费电子产品所采用的嵌入式处理器芯片的种类繁杂,如何让编写的程序跨平台运行也是个难题。 为了解决困难,他们首先着眼于语言的开发。对于新语言的设计,Sun公司研发人员并没有开发一种全新的语言,而是根据嵌入式软件的要求,对C++进行了改造,去除了留在C++的一些不太实用及影响安全的成分,并结合嵌入式系统的实时性要求,开发了一种称为Oak的面向对象语言。后来Oak语言也就因为缺乏硬件的支持而无法进入市场,从而被搁置了下来。
1995年,互联网的蓬勃发展给了Oak机会。业界为了使死板、单调的静态网页能够“灵活”起来,急需一种软件技术来开发一种程序,这种程序可以通过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了大量的人力、物力和财力。这个时候,Sun公司想起了那个被搁置起来很久的Oak,并且重新审视了那个用软件编写的试验平台,由于它是按照嵌入式系统硬件平台体系结构进行编写的,所以非常小,特别适用于网络上的传输系统,而Oak也是一种精简的语言,程序非常小,适合在网络上传输。
在申请注册商标时,发现Oak已经被人使用了,再想了一系列名字之后,最终,使用了提议者在喝一杯Java咖啡时无意提到的Java词语。
Java语言发展到今天经历了一系列的过程:
- 1991年,SUN公司的Green项目,Oak
- 1995年,推出Java测试版
- 1996年,JDK1.0
- 1997年,JDK1.1
- 1998年,JDK1.2,大大改进了早期版本缺陷,是一个革命性的版本,更名为Java2。
- 2004年,J2SE 5.0 (1.5.0) Tiger老虎
- 2006年,J2SE 6.0 (1.6.0) Mustang野马
- 2011年,JavaSE7.0 Dolphin海豚
- 2014年,JavaSE8.0
- 2017年,JAVA 9.0
- 2018年3月,JAVA 10
- 2018年9月,JAVA 11
- 2019年3月,JAVA 12
- 2019年9月,JAVA 13
- 2020年3月,JAVA14
2009年,SUN公司已经被oracle公司收购,Oracle公司推出的第一个Java版本是JDK1.7。目前每半年更新一次java的版本。但是,企业中的主流仍然以8为主。对于初学者,应该以企业主流应用版本为核心进行学习,没有必须在此处追求最新版本。
与 Java 9 和 Java 10 两个被称为“功能性的版本”不同(两者均只提供半年的技术支持),Java 11 不仅提供了长期支持服务(LTS,Long Term Support),还将作为 Java 平台的参考实现。Oracle 直到2023年9月都会为 Java 11 提供技术支持,而补丁和安全警告等扩展支持将持续到2026年。新的长期支持版本每三年发布一次,根据后续的发布计划,下一个长期支持版 Java 17 于2021年发布。
1.4 Java三大版本
- J2SE Java的标准版本 (Java2 Standard Edition) 定位在客户端,主要用于桌面应用软件的编程
- J2EE 企业版本(Java2 Enterprise Edition)定义在服务器端Java2的企业版,主要用于分布式网络程序的开发,如电子商务网站
- J2ME (Java2 Micro Edition) 主要应用于嵌入式系统开发,如手机和PDA的编程
2005 JavaOne大会召开,Sun公司公开Java SE6。此时,Java的各种版本被更名,取消其中的数字"2":J2EE更名为Java EE, J2SE更名为Java SE,J2ME更名为Java ME
二、Java特点
2.1 Java特点
1.跨平台/可移植性
这是Java的核心优势。Java在设计时就很注重移植和跨平台性。比如:Java的int永远都是32位。不像C++可能是16,32,可能是根据编译器厂商规定的变化。这样的话程序的移植就会非常麻烦。
2.安全性
Java适合于网络/分布式环境,为了达到这个目标,在安全性方面投入了很大的精力,使Java可以很容易构建防病毒,防篡改的系统。比如Java取消了强大但又危险的指针。由于指针可进行移动运算,指针可随便指向一个内存区域,而不管这个区域是否可用,这样做是危险的。
3.面向对象
面向对象是一种程序设计技术,非常适合大型软件的设计和开发。由于C++为了照顾大量C语言使用者而兼容了C,使得自身仅仅成为了带类的C语言,多少影响了其面向对象的彻底性!Java则是完全的面向对象语言。
4.简单性
Java就是C++语法的简化版,我们也可以将Java称之为“C++-”。跟我念“C加加减”,指的就是将C++的一些内容去掉;比如:头文件,指针运算,结构,联合,操作符重载,虚基类等等。同时,由于语法基于C语言,因此学习起来完全不费力。
5.高性能
Java最初发展阶段,总是被人诟病“性能低”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免。Java语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如,通过JIT(JUST IN TIME)即时编译技术提高运行效率。 将一些“热点”字节码编译成本地机器码,并将结果缓存起来,在需要的时候重新调用。这样的话,使Java程序的执行效率大大提高,某些代码甚至接近C++的效率。
因此,Java低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多C++应用转到Java开发,很多C++程序员转型为Java程序员。
6.分布式
Java是为Internet的分布式环境设计的,因为它能够处理TCP/IP协议。事实上,通过URL访问一个网络资源和访问本地文件是一样简单的。Java还支持远程方法调用(RMI,Remote Method Invocation),使程序能够通过网络调用方法。
7.多线程
多线程的使用可以带来更好的交互响应和实时行为。 Java多线程的简单性是Java成为主流服务器端开发语言的主要原因之一。
8.健壮性
Java是一种健壮的语言,吸收了C/C++ 语言的优点,但去掉了其影响程序健壮性的部分(如:指针、内存的申请与释放等)。Java程序不可能造成计算机崩溃。即使Java程序也可能有错误。如果出现某种出乎意料之事,程序也不会崩溃,而是把该异常抛出,再通过异常处理机制加以处理。
2.2 Java跨平台
Java为消费类智能电子产品而设计,但智能家电产品并没有像最初想象的那样拥有大的发展。然而90年代,Internet却进入了爆发式发展阶段,一夜之间,大家都在忙着将自己的计算机连接到网络上。这个时侯,遇到了一个大的问题。人们发现连接到Internet的计算机各式各样,有IBM PC、苹果机、各种服务器等等,不仅硬件CPU不同,操作系统也不同,整个的网络环境非常复杂。这个时候,程序员们希望他们编写的程序能够运行在不同的机器,不同的环境中,这需要一种体系中立的语言(即跨平台)。Java的研发小组忽然发现他们用于小范围的语言也可以适应Internet这个大环境。
跨平台是Java语言的核心优势,赶上最初互联网的发展,并随着互联网的发展而发展,建立了强大的生态体系,目前已经覆盖IT各行业的“第一大语言”,是计算机界的“英语”。
虽然,目前也有很多跨平台的语言,但是已经失去先机,无法和Java强大的生态体系抗衡。Java仍将在未来几十年成为编程语言的主流语言。
计算机高级语言的类型主要有编译型和解释型两种,而Java 语言是两种类型的结合。
Java首先利用文本编辑器编写 Java源程序,源文件的后缀名为.java;再利用编译器(javac)将源程序编译成字节码文件,字节码文件的后缀名为.class; 最后利用虚拟机(解释器,java)解释执行。如图所示。
Java的跨平台原理可以使用八个字修饰:一次编译,到处运行。Java程序的跨平台主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行,Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码进行运行。
问:Java是否可以跨所有的平台呢?
答:如果提供并安装了相应的虚拟机,就可以该平台上运行,否则不行。
扩展:C/C++语言的跨平台原理:多次编译,到处运行。
两种跨平台的比较:在互联网情况下,平台各异,一个编译后的Java程序可以放在不同的平台上并运行,不需要准备多个编译的结果,优势明显。
性能高低:理论上,C/C++语言是执行机器码,而Java的执行增加了一个将字节码转换为机器码后再执行的步骤,所以Java的性能要低于C/C++。但是经过虚拟机优化后,可以大幅提升执行效率,接近C/C++的执行效率。
2.3 JVM、JRE和JDK
JVM(Java Virtual Machine)就是一个虚拟的用于执行bytecode字节码的”虚拟计算机”。他也定义了指令集、寄存器集、结构栈、垃圾收集堆、内存区域。JVM负责将Java字节码解释运行,边解释边运行,这样,速度就会受到一定的影响。
不同的操作系统有不同的虚拟机。Java 虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”。 Java虚拟机是实现跨平台的核心机制。
Java Runtime Environment (JRE) 包含:Java虚拟机、库函数、运行Java应用程序所必须的文件。
Java Development Kit (JDK)包含:包含JRE,以及增加编译器和调试器等用于程序开发的文件。
JDK、JRE和JVM 的关系如图所示。
建议:
1.如果只是要运行Java程序或者像Minecraft这样的JAVA游戏,只需要JRE就可以。JRE通常非常小,其中包含了JVM。
2.如果要开发Java程序,就需要安装JDK。
三、准备操作
3.1 安装配置JDK
1.下载JDK
下载地址,点击进入:
www.oracle.com/technetwork/java/javase/downloads/index.html
点击JDK Download,出现下图所示下载列表界面。选择相应操作系统下的版本下载。此处选择Window平台下的安装版本:
选择“I reviewed and accept the Oracle Technology Network License Agreement for Oracle Java SE”,接受协议,进行下载。
2.安装JDK
安装过程和普通软件安装没什么区别,基本都是点击“下一步”就能完成安装。过程中会让你选择JDK安装目录,可以进行修改,也可以采用默认目录。
安装JDK——安装目录界面:
安装JDK——修改JDK安装目录
安装JDK——成功安装界面
出现如上画面代表,JDK安装成功。
3.环境变量Path的配置
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。
Path是一个常见的环境变量,它告诉操作系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下寻找此程序外,还应到哪些目录下寻找。
设置Path环境变量的步骤如下
1. 右键计算机——>属性——>高级系统设置,出现下图所示界面。
设置环境变量——进入设置窗口
2. 单击环境变量按钮,进入下图所示环境变量操作主界面:
设置环境变量——操作主界面
3. 单击新建按钮,新建JAVA_HOME变量(用于说明JDK的安装目录),如图所示。
设置环境变量——设置JAVA_HOME变量
4.修改系统环境变量Path,在最前面追加%JAVA_HOME%\bin 并以;和原路径分隔。
设置环境变量——设置Path变量
此处一定是英文分号而不是中文分号! 以后设置相关配置时要注意中英文符号区别。 |
5.测试JDK安装成功
进入命令行窗口,开始菜单搜索框输入“cmd”即可,如图所示。在窗口中输入命令“java -version ”,回车。出现如下结果,则说明JDK安装成功。
设置环境变量——验证JDK安装和配置是否成功
6.卸载JDK
1. 开始菜单——>控制面板——>程序和功能。
2. 选中要删除的JDK——>卸载。
3. 删除环境变量中的JAVA_HOME
4. 删除环境变量PATH中关于JDK的配置(不是删除PATH环境变量)。
3.2 DOS命令入门
DOS(Disk Operating System)是一种单用户单任务磁盘操作系统。
DOS是英文Disk Operating System(磁盘操作系统)的缩写,它最早是由美国微软(Microsoft)公司研制开发的一种操作系统。有时会看到MS-DOS或PC-DOS两种提法,其实这两者的功能差不多,只不过MS-DOS是由微软公司(Microsoft缩写是MS)制作销售的,而PC-DOS是由国际商用机器公司(IBM)制作销售的。当然Windows操作系统中所包含的DOS是属于MS-DOS。
自从DOS在1981年问世以来,版本就不断更新,纯DOS从最初的DOS1.0升级到DOS6.22(纯DOS),这以后的新版本DOS都是由Windows系统所提供的,并不单独存在,版本有Windows 95下的DOS7.0,Windows ME下的DOS8.0等
DOS命令已经基本退出普通使用者的历史舞台了,但是仍然有必要掌握几个常用的命令,便于在某些情况下更顺畅的操作程序。
- cd 目录路径 进入一个目录
- cd .. 进入父目录
- dir 查看本目录下的文件和子目录列表
- cls 清除屏幕命令
- 上下键 查找敲过的命令
- Tab键 自动补齐命令
- Ipconfig 网络配置信息
- Ping 测试网络是否通信
四、开发Java程序
4.1.Hello Java
1.开发源代码
/** 定义一个类,类名是Test */ public class Test{ /* 定义一个main方法,是程序执行的入口 */ public static void main(String args[]){ //输出内容,双引号内容原样输出 System.out.print("Hello Java"); } } |
2.编译源代码(.java---->.class)
打开命令行窗口,进入Java源代码文件所在目录;执行命令:javac Test.java,生成class文件。注意:编译时必须加上扩展名.java
3.解释执行字节码文件(.class--->机器码)
执行:”java Welcome”(就是运行编译生成的Welcome.class),输出执行结果。注意:执行的是类而非class文件,所以类名后不能加扩展名.class
注意:
- Java对大小写敏感,如果出现了大小写拼写错误,程序无法运行。
- 关键字public被称作访问修饰符(access modifier),用于控制程序的其它部分对这段代码的访问级别。
- 关键字class 的意思是类。Java是面向对象的语言,所有代码必须位于类里面。
- main方法是Java应用程序的入口方法,它有固定的书写格式:
- public static void main(String[] args) {…}
- System.out.println()是Java提供的输出语句,输出内容到控制台。
- 在Java中,用花括号划分程序的各个部分,任何方法的代码都必须以“{”开始,以“}”结束。
- 注释。注释就是程序员为读者作的说明,是提高程序可读性的一种手段。
- 注释一共有三种类型。
- // 单行注释 注释内容从//到本行结尾
- /* */ 多行注释 /* */ 注释不能嵌套
- /** */文档注释 可以通过JDK提供的Javadoc命令,生成程序的API文档(面向对象编程时再讲)
4.2.第二个示例
public class Introduce{ public static void main(String args [] ){ System.out.print("姓名:张三丰\t"); System.out.print("性别:男\t"); System.out.println("年龄:132"); } } |
第二个Java程序的总结和提升
- 复习巩固第一个Java程序所学内容
- 理解println( )和print( )的区别
- System.out.println(); 输出并换行 line
- System.out.print(); 输出不换行
- 认识最简单的转义字符 \t \n
- \n 换行符
- \t tab键 table
- 一个源文件可以有多个class
- 一个源文件中至多只能有一个public的类声明,其它类的个数不限,如果源文件中包含一个public 类,源文件名必须和它中定义的public的类名相同,且以“java”为扩展名。
4.3.反编译工具
编译: .java---> .class
反编译:.class ---->.java
反编译工具有很多,此处使用jd-gui.exe
注意:因为编译的时候不会对注释进行处理,所以反编译时不可能得到注释
当然,也有一些商业软件,对其程序进行了混淆加密,这样我们就很难用工具反编译了。