一、计算机语言的发展历史
学编程语言之前我们先了解一下计算机编程语言的发展,随着计算机本身硬件发展,硬件速度越快、体积越小、成本越低,应用到人类社会的场景就会越多,那么所需要的算法就会越复杂,也就要求计算机编程语言越高级。最初重达几十吨但一秒只能运算5000次的ENIAC(世界上第一台计算机),只能做非常小的应用,比如:某些情况的弹道计算。现在任何一个人的手机运算能力都可以秒杀那个年代地球上所有计算机运算能力的总和。计算机编程语言的发展历经了从低级到高级发展。发展的核心思想就是“让人更容易编程”。越容易使用的语言,就有越多人使用;越多人使用,就有越多协作;越多协作,就可以创造越复杂的物体;计算机语言经历了三代:第一代是机器语言,第二代是汇编语言,第三代是高级语言。
【1】第一代:机器语言(相当于人类的原始阶段)
机器语言是机器指令的集合,机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器指令是一列二进制数字。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,从而进行运算。上面所说的计算机,指的是可以执行机器指令,进行运算的机器。这是早期计算机的概念。早期的程序设计均使用机器语言。程序员们将用 0、1 数字编程的程序代码打在纸袋或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,从而进行运算。
应用8086CPU完成运算s=768+12288-1280,机器码如下:
假如将程序错写成以下的错误,请你找出错误:
书写和阅读机器码程序不是一件简单的工作,要记住所有抽象的二进制码。上面只是一个非常简单的小程序,就暴露出机器码的晦涩难懂和不易查错。写如此小的一个程序尚且如此,实际上一个有用的程序至少要有几十行的机器码。那么,情况将会怎么样呢?
在显示器输出“welcome to masm”,机器码如下:
看到这样的程序,你有什么感想?如果程序里有一个“1”被误写成为“0”,又如何去查找错误呢?
【2】第二代:汇编语言(相当于人类的手工业阶段)
为了编程的方便,以及解决更加复杂的问题。程序员开始改进机器语言,使用英文缩写的助记符来表示基本的计算机操作。这些助记符构成了汇编语言的基础。如下是一些常见的汇编语言助记符(单词)比如:mov,add,sub之类,这样人更容易使用了。识别几百、几千个单词,感觉要比几百几千个数字,美妙多了。汇编语言相当于人类的手工业社会,需要技术极其娴熟的工匠,但是开发效率也非常低。汇编语言虽然能编写高效率的程序,但是学习和使用都不是易事,并且很难调试。另一个复杂的问题,汇编语言以及早期的计算机语言(Basic、Fortran等)没有考虑结构化设计原则,而是使用goto语句来作为程序流程控制的主要方法。这样做的后果是:一大堆混乱的调转语句使得程序几乎不可能被读懂。对于那个时代的程序员,能读懂上个月自己写的代码都成为一种挑战。 汇编语言仍然应用于工业电子编程领域、软件的加密解密、计算机病毒分析等。
下面以Masm软件为例,编写一个简单的“hello world!”程序。
【3】第三代:高级语言(相当于人类的工业阶段)
对于简单的任务,汇编语言可以胜任。但是随着计算机的发展,渗透到了工作生活的更多的方面,一些复杂的任务出现了,汇编语言就显得力不从心(应该说是程序员使用汇编语言解决复杂问题出现了瓶颈)。于是,出现了高级语言。像我们熟知的C、C++、Java等等都是高级语言。
高级语言允许程序员使用接近日常英语的指令来编写程序。例如下图所示:
二、Java的历史
java是由SUN公司的詹姆斯·高斯林 (James Gosling)发明的,但是现在SUN公司被Oracle收购了
▪ 1991年,Sun公司的Green项目,Oak
▪ 1995年,推出Java测试版
▪ 1996年,JDK1.0
▪ 1997年,JDK1.1
▪ 1998年,JDK1.2,大大改进了早期版本的缺陷,是一个革命性的版本,更名为Java2
▪ 1999 Java被分成J2SE、J2EE 和J2ME,JSP/Servlet技术诞生
▪ 2004年,J2SE 5.0 (1.5.0) Tiger老虎.为了表示这个版本的重要性,J2SE1.5更名为J2SE5.0。
▪ 2006年,J2SE 6.0 (1.6.0) Mustang野马.此时,Java的各种版本被更名,取消其中的数字"2":J2EE更名为Java EE, J2SE更名为 Java SE,J2ME更名为Java ME
▪ 2009年4月20日甲骨文收购Sun公司,交易价格达74亿美元
▪ 2011年,JavaSE7.0
▪ 2014年 ,JavaSE8.0
▪ 2017年,JavaSE9.0
▪ 2018年3月,JavaSE10.0
▪ 2018年9月,JavaSE11.0
▪ 2019年3月,JavaSE12.0
▪ 2019年9月,JavaSE13.0
▪ 2020年3月,JavaSE14.0
…
我们一般都基于8讲解,没必要学习最新的,企业一般都以稳定为主。我们再介绍一下不同版本JDK说明
JDK Version 1.1:于1997-02-19发行。
引入的新特性包括:引入JDBC(Java Database Connectivity);支持内部类;引入Java Bean;
引入RMI(Remote Method Invocation);引入反射(仅用于内省)。
J2SE Version 1.2:开发代号为Playground(操场),于1998-12-08发行。
引入的新特性包括:引入集合(Collection)框架;对字符串常量做内存映射;引入JIT(Just In Time)编译器;
引入对打包的Java文件进行数字签名;引入控制授权访问系统资源的策略工具;
引入JFC(Java Foundation Classes),包括Swing 1.0、拖放和Java 2D类库;
在JDBC中引入可滚动结果集、BLOB、CLOB、批量更新和用户自定义类型;
在Applet中添加声音支持。引入Java 插件;
J2SE Version 1.3:开发代号为Kestrel(红隼),于2000-05-08发行。
引入的新特性包括:
引入Java Sound API;
jar文件索引;
对Java的各个方面都做了大量优化和增强。
J2SE Version 1.4:开发代号为Merlin(隼),于2004-02-06发行(首次在JCP下发行)。
引入的新特性包括:
XML处理;
Java打印服务;
引入Logging API;
引入Java Web Start;
引入JDBC 3.0 API;
引入断言;
引入Preferences API;
引入链式异常处理;
支持IPv6;
支持正则表达式;
引入Image I/O slot machine API。
Java Version SE 5.0:开发代号为Tiger(老虎),于2004-09-30发行。
引入的新特性包括:
引入泛型;
增强循环,可以使用迭代方式;
自动装箱与自动拆箱;
类型安全的枚举;
可变参数;
静态引入;
元数据(注解);
引入Instrumentation。
Java Version SE 6: 开发代号为Mustang(野马),于2006-12-11发行。
引入的新特性包括:
支持脚本语言;
引入JDBC 4.0 API;
引入Java Compiler API;
可插拔注解;
增加对Native PKI(Public Key Infrastructure)、Java GSS(Generic Security Service)、Kerberos和 LDAP(Lightweight Directory Access Protocol)的支持;
继承Web Services;
做了很多优化。
Java Version SE 7:开发代号是Dolphin(海豚),于2011-07-28发行。
引入的新特性包括:
switch语句块中允许以字符串作为分支条件;
在创建泛型对象时应用类型推断;
在一个语句块中捕获多种异常;
支持动态语言;
支持try-with-resources;
引入Java NIO.2开发包;
数值类型可以用2进制字符串表示,并且可以在字符串表示中添加下划线;
钻石型语法;
null值的自动处理。
Java Version SE 8:开发代号是Spider(蜘蛛),于2014-03-18发行。
支持 lambda支持;
增强日期与时间API的功能;
对垃圾回收的性能也进行了改进;
并且移除了permgen区。
Lambdas表达式与Functional接口
接口的默认与静态方法
方法引用
重复注解
更好的类型推测机制
扩展注解的支持
…
三、Java体系结构
JavaSE(Java Standard Edition):标准版,定位在个人计算机上的应用
这个版本是Java平台的核心,它提供了非常丰富的API来开发一般个人计算机上的应用程序,包括用户界面接口AWT及Swing,网络功能与国际化、图像处理能力以及输入输出支持等。在上世纪90年代末互联网上大放异彩的Applet也属于这个版本。Applet后来为Flash取代,Flash即将被HTML5取代。
JavaEE(Java Enterprise Edition):企业版,定位在服务器端的应用
JavaEE是JavaSE的扩展,增加了用于服务器开发的类库。如:JDBC是让程序员能直接在Java内使用的SQL的语法来访问数据库内的数据;Servlet能够延伸服务器的功能,通过请求-响应的模式来处理客户端的请求;JSP是一种可以将Java程序代码内嵌在网页内的技术;
JavaME(Java Micro Edition):微型版,定位在消费性电子产品的应用上
JavaME是JavaSE的内伸,包含J2SE的一部分核心类,也有自己的扩展类,增加了适合微小装置的类库:javax.microedition.io.*等。该版本针对资源有限的电子消费产品的需求精简核心类库,并提供了模块化的架构让不同类型产品能够随时增加支持的能力。
四、Java的语言特点
- 面向对象(使用计算机模拟现实世界,解决现实问题,贴近人类思维)
- 简单(相对C、C++,不易造成内存溢出、减少代码量、代码可读性强)
- 跨平台(操作系统、服务器、数据库)
跨平台这里我们着重介绍一下,Java的跨平台原理核心在于JVM,在每个操作系统分别对应安装一个JVM,我们写的java源文件编译运行在JVM中产生一个二进制的字节码文件,就像图中这样:
然后由JVM将运行产生的class字节码文件一行行解释成为操作系统认识的可执行文件,Java为什么这样做呢?为了安全,我们拿Java和经典的C语言比较一下
C语言直接和操作系统接触,语言层面万一出现问题比如内存和指针,那么会导致操作系统崩溃,但Java语言则把这些问题抛给JVM,语言层面无需关心,所有问题都会被JVM处理掉,不会让操作系统崩溃,所以我们说Java语言是安全的
五、Java的环境搭建
在搭建环境之前我们先解释一下名词
JDK(Java Development Kit)开发环境,编写Java程序的程序员使用的软件,包含JRE + 类库 + 开发工具包
JRE(Java Runtime Environment)运行环境,运行Java程序的用户使用的软件,包含JVM和解释器
JVM(Java Virtual Machine)Java虚拟机
下载JDK:https://www.oracle.com/java/technologies/javase-downloads.html,选择一个合适的jdk下载即可
安装JDK:跟正常安装软件没什么区别
配置JDK:这步如果不做的话每次编译运行Java文件都需要先写javac和java的全路径,后面再写文件的名字
备注:javac是编译源文件的命令,java是执行字节码文件的命令。
步骤:右击我的电脑–属性–高级系统设置–环境变量–并填写以下内容
JAVA_HOME:你安装jdk的路径,这是我的安装路径:C:\Program Files\Java\jdk1.8.0_131
再修改一下path变量,%JAVA_HOME%\bin
如果是window7则需要这样配,后面加一个分号
测试:打开DOS窗口:Windows键 + R——快捷键呼出运行窗口,输入cmd
输入java -version出现版本号,就表示配置成功
补充:path环境变量作用:将命令所在的路径配置到path中去,就相当于在计算机中“注册”了一样,以后 找这个命令,会直接去你配置的路径下寻找。达到了一个效果:在任意的路径下去执行某个命令—》path环境针对整个操作系统而言。就比如没配path变量之前,java命令需要输入jdk的全安装路径,配了path变量之后,直接输入Java命令即可。
classpath环境变量:有些教程会配这个,实际配不配都可以,只是可以在任意的路径下去执行字节码文件,默认就是.\值
六、常见的DOS命令
-
DOS操作系统
- Microsoft公司推出的操作系统。(在windows之前的操作系统)
- DOS是英文"Disk Operating System"的缩写,其中文含意是"磁盘操作系统".
- DOS是单用户、单任务的操作系统.(只能执行一个任务)
-
DOS命令
-
在windows中,我们通过鼠标菜单等来操作系统,而在dos操作系统中,要通过dos命令来操作系统。
-
是DOS操作系统的命令,是一种面向磁盘的操作命令,
-
不区分大小写。
-
windows给我们保留了类似dos系统的操作界面,可以直接操作磁盘
控制命令台:win+r—>cmd
- 更换盘符:d:
- 查看当前目录下的文件及文件夹:dir
- 进入文件夹:cd 文件夹的名字
- 返回上一级目录:cd ..
- 清空屏幕:cls
- 删除文件:del 文件名
- 删除文件夹:rd 文件夹名称
- 退出:exit
-
六、第一段程序
写第一段程序之前,我们还需要一个编写代码的工具,我们固然可以用电脑自带的记事本写,但问题是程序出问题时不好定位在第几行出现了问题,你需要一行行找,所以我们安装一个编辑器,程序出现问题能更好的查找。
我们可以先选择notepad++ 这样的文本编辑器,等学到后面可以再使用Eclipse或者IDEA这样的IDE开发工具 。
准备工作做好之后,就可以着手写第一个程序,学习任何技术基本都爱用HelloWorld作为演示案例,我们也以它作为案例,首先建立一个HelloWorld.java的文件,里面的代码如下:
/**
* 解释一下注释,注释的作用就是方便人阅读的,程序编译时会跳过这些注释,下面这些解释的文字就是一个个注释,注释还分为3种
* 1、单行注释:// 注释的内容
* 2、多行注释:/*注释的内容 */
// 3、文档注释:/**注释的内容*/,此注释可以配合javadoc.exe生成一套以网页文件形式体现的该程序的说明文档
//public修饰的类是一个公共类只能有一个,这个类的类名必须与文件名一致
public class HelloWorld {
//程序的主方法,表示程序的入口,一个类只能有一个主程序入口
public static void main(String[] args) {
//输出语句,输出双引号中的内容,双引号中的内容可以随意改变
System.out.println("第一段程序!");
}
}
//一个java文件可以有多个类,不是public的就好,但是通常我们类和类都是分开的,编译时一个java源文件的每个类都会生成一个class文件
class B{
}
注意:
- 建立文件之前把文件的后缀名打开,如若不然,你创建的文件还是.txt为后缀名(HelloWorld.java.txt)
- 如果复制上面的代码保存时要以ANSI格式保存,要不编译时会乱码
- 所有的标点符号必须是英文,分号和逗号等
- 有大括号的语句都是成对出现的,没有大括号的语句结尾都是以分号结束
- Java语言严格区分大小写
演示一下如何编译:
- 打开cmd窗口,切换到java文件的路径下
- 通过javac命令对该java文件进行编译(javac HelloWorld.java)生成.class文件
- 通过java命令运行生成的class字节码文件(java HelloWorld)