Sun 公司(已被 Oracle 收购)于 1995 年 5 月推出了 Java 程序设计语言和 Java 平台。在二十多年的时间里,Java 技术因为其具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人计算机、数据中心、游戏控制台、科学计算、移动电话和互联网,拥有全球最大的开发者群体。在全球云计算、大数据、移动互联网的产业环境下,Java 更具备了显著优势和广阔前景。
下面我们首先对 Java 做大致的了解。
Java 的诞生
1995 年 5 月 23 日,在 Sun World 大会上,第一次公开发布 Java 和 HotJava 浏览器。在这个会议上,网景公司(当时该公司浏览器占据浏览器市场份额的绝对领先地位)宣布将在其浏览器中支持 Java,随后一系列的公司表示了对 Java 的支持,使 Java 很快成为一个极具发展潜力的高级语言。
JDK 1
1995 年,Sun 推出的 Java 只是一种语言,而想要开发复杂的应用程序,必须有一个强大的开发库支持才行。
在 1996 年 1 月,Sun 发布了 JDK 1.0,它包括了两部分:JRE(Java Runtime Environment,Java 运行环境)和 JDK(Java Development Kit,Java 开发工具)。在 JRE 中包括了核心 API、集成 API、用户界面 API、发布技术、JVM (Java Virtual Machine,Java 虚拟机)五个部分,JDK 包括 JRE 的同时还包括了编译工具。在 JDK 1.0 时代,Java 库显得比较单薄,不够完善。随着 JDK 的逐步升级,它为开发人员提供了一个强大的开发支持库。
JDK 2
1998 年 12 月,Sun 发布了 Java 历史上一个重要的 JDK 版本—JDK1.2,并开始使用“Java 2”这一名称。从 JDK 1.2 发布开始,Java 踏入了飞速发展的时期。Java 2 针对不同类型的应用,推出了 3 个平台:J2SE(Java 2 Standard Edition,Java 2 标准版),J2EE(Java 2 Enterprise Edition,Java 2 企业版)和 J2ME(Java 2 Micro Edition,Java 2 微缩版)。
在 Java 2 时代,Sun 对 Java 进行了很多革命性的改变,而这些革命性的变化一直沿用到现在,对 Java 的发展形成了深远的影响。此后,还发布了以下主要版本的 Java。
2000 年 5 月,发布 J2SE 1.3。
2002 年 2 月,发布 J2SE 1.4。
JDK 5
2004 年 9 月 30 日,J2SE 1.5 发布,成为 Java 语言发展史上的又一重要版本。为了表示该版本的重要性,J2SE 1.5 更名为 Java SE 5.0。
在 5.0 中,主要包含以下新特性:
泛型
JDK 7
2011 年 7 月,JDK 7.0 发布,带入了一些新的功能。例如,原来 switch 结构的条件中只能包含 byte、short、int、char 类型,但从 7.0 开始,就可以包含字符串了。
JDK 8
2014 年 3 月,JDK8.0 发布,该版本新增了 lambda 表达式、方法引用等新特性,标志着 Java 开始迈向了函数式编程的道路,是 Java 发展史上另一个重要的里程碑。
JDK 9 及新版本规划
2017 年 9 月,JDK9.0 发布,并且 Oracle 公司宣布从 JDK9.0 开始,将 JDK 的更新频率改为每隔半年发布一个新版本。此后,原本如日中天的 Java 语言,更是走上了飞速发展的时代。
此外,还要提醒大家的是,Oracle 公司曾在 2018 年宣布过一条通知“2019 年 1 月以后发布的 Oracle Java SE 8 公开更新将不向没有商用许可证的业务、商用或生产用途提供”。因此,在基础学习阶段,建议大家使用 2019 年 1 月之前的 JDK 版本。
以下是 Java 语言的主要特点:
要想系统地说明 Java 语言的特点,需要大篇幅、长时间地进行介绍。为了便于初学者快速理解,下面只简单介绍其中的 4 个特点且过滤掉了一些难以理解的内容,待读者有一定基础后可自行查阅 Java 相关文档。
Java 属于高级语言
相对于机器语言、汇编语言,Java 和 C++、C#、Python 等语言都被称之为高级语言,因为这些语言书写的代码越来越接近人类的自然语言。
面向对象
传统以 C 语言为代表的过程式编程语言以过程为中心,以算法为驱动(程序=算法+数据)。而面向对象编程语言则以对象为中心,以消息为驱动(程序=对象+消息)。Java 是典型的面向对象的语言,具体面向对象的概念和应用会在后面的课程中详细介绍。
平台无关
所谓 Java 语言是平台无关的语言,是指用 Java 编写的应用程序,编译成字节码文件(.class 后缀)后,不用修改就可在不同的软/硬件平台上运行。这得益于 Java 的虚拟机,这部分知识将在下一节详细介绍。
健壮性
Java 的健壮性有两个体现:
1.Java 丢弃了指针。这样可以杜绝内存的非法访问,虽然牺牲了程序员操作的灵活性,但对程序的健壮性而言,不无裨益。
2.Java 的垃圾回收机制。Java 的垃圾回收机制是 Java 虚拟机提供的管理内存的机制,用于在空闲时间以不定时的方式动态回收无任何引用的对象所占据的内存空间。
Java 从诞生至今,主要衍生出了三个体系,即 Java SE,Java EE,Java ME。
Java SE(Java Standard Edition)
Java SE 是 Java 的基础,也是 Java 的核心。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 为 Java EE 提供了基础。
Java EE(Java Enterprise Edition)
Java EE 是在 Java SE 基础之上发展起来的 Java 企业版,包含了 Web 开发等企业级的开发技术,多用于 Web 系统的服务端开发。使用 Java EE 可以快速开发出安全、稳定、性能较高的大型系统。因此 Java EE 也是很多企业在技术选型阶段的一个重要考虑方向。
Java ME(Java Micro Edition)
在 Java 发展之初,Java 还有另一个分支 — Java ME。Java ME 可以用于一些嵌入式设备的 Java 程序开发。但随着时代的发展,Java ME 逐步走向没落,目前的应用范围也在逐步缩小。
4.Java程序的工作原理
a.从源码到机器码
在整个 Java 程序的开发流程中,程序员最初是将代码写在后缀为 .java 的文件中,之后再通过编译工具将 .java 文件转换 .class 文件(也称为字节码文件)。这个“转换”过程中,又可以细分为以下四个阶段:
什么是 JRE 呢?JRE(Java Runtime Environment,Java 运行环境)是 JVM(Java Virtual Machine,Java 虚拟机)和一些常用 API(Application Programming Interface,应用程序接口)的合集。
JVM 负责前文提到的解释并执行字节码。那什么是 API 呢?可以将 API 理解为是一些已经写好的、可以供我们直接使用的代码。举个例子,如果要编写一个排序算法该怎么办?除了自己一行一行的编写代码以外,还可以直接使用 JDK 中已经提供好的排序 API,直接使用 API 里的某一行代码就能帮助我们实现排序功能,是不是很方便呢?并且为了归类,API 通常是以“包”的形式体现的,例如 java.io 就是一个汇集了很多文件操作的包,而 java.lang 是一个汇集了很多程序基础操作的包。
综上,可以发现 JDK 包含了开发工具和 JRE,而 JRE 又包含了 JVM 和常用 API,如下图所示。因此,对于开发者而言,就只需要下载并安装 JDK,然后就可以开发并运行 Java 程序了。
c.字节码是什么
Java 的字节码是 Java 虚拟机执行的一种指令格式。
字节码解释过程
如下图所示,Java 字节码文件先后经过 JVM 的类装载器、字节码校验器和解释器,最终在操作系统平台上运行。具体各部分的主要功能描述如下。
类装载器。其主要功能是为执行程序寻找和装载所需要的类,就是把字节码文件装到 Java 虚拟机中。
字节码校验器。其功能是对字节码文件进行校验,保证代码的安全性。字节码校验器负责测试代码段格式并进行规则检查,检查伪造指针、违反对象访问权限或试图改变对象类型的非法代码。
解释器。具体的平台并不认识字节码文件,最终起作用的还是这个最重要的解释器,它将字节码文件翻译成所在平台能识别的东西。
d.即时编译
JVM 可判断某段字节码其是否属于使用频率较高的热点代码。如果是,就会将字节码文件转换出的本地机器码保存,以便下次直接执行机器码文件。这使得 Java 程序的执行效率得到很大的提高。
e.Java跨平台原理
Java 能够拥有如此优秀的跨平台机制,主要归功于 JVM。
JVM 与跨平台机制
JVM 不是一台真实的机器,而是想象中的机器,通过模拟真实机器来运行 Java 程序。 既然是模拟出来的机器,JVM 看起来同样有硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java 程序运行在这个抽象的 Java 虚拟机上,它是 Java 程序的运行环境,也是 Java 最具吸引力的特性之一。
前面提到过,Java 语言的一个重要特点就是平台无关性,接下来将从原理上进一步说明为什么 Java 语言具有这样的平台无关性。实现 Java “一次编译,处处运行” 的关键就是使用了 Java 虚拟机。
例如,使用 C 语言开发一个类似计算器的软件,如果想要使这个软件在 Windows 平台上运行,则需要在 Windows 平台下编译成目标代码,这个计算器的目标代码只能在 Windows 平台上运行。而如果想让这个计算器软件能在 Linux 平台上运行,则必须在对应的平台下编译,产生针对该平台的目标代码,才可以运行。
但对于 Java 而言,则完全不是这样。用 Java 编写的计算器程序(.java 后缀)经过编译器编译成字节码文件,这个字节码文件不是针对具体平台的,而是针对抽象的 Java 虚拟机的,在 Java 虚拟机上运行。而在不同的平台上,会安装不同的 Java 虚拟机,这些不同的 Java 虚拟机屏蔽了各个不同平台的差异,从而使 Java 程序(字节码文件)具有平台无关性。也就是说,Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行,具体原理如下图所示。
f.垃圾回收机制
在 C++ 中,程序结束运行之前,对象会一直占用内存,并在程序员明确释放之前不能将其所占内存分配给其他对象。
而 Java 的处理方式不同,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。作为初学者,可以简单的理解为,当一个对象不再被其他对象使用时,该对象就会成为一个等待被回收的垃圾对象。
Java 虚拟机提供了一个系统级线程(垃圾回收器线程),它自动跟踪每块被分配出去的内存空间,自动释放被定义成垃圾的内存。在一些书籍或文献中,垃圾回收器通常被称为 GC(Garbage Collection)。
垃圾回收机制能自动释放内存空间,减轻程序员编程的负担,这是 Java 虚拟机具有的一个显著优点。
Windows 环境下 JDK 8 的安装
Windows 10 操作系统下安装 JDK 8 为例。
此处演示的 JDK 版本是 jdk1.8.0_91,安装在 D:\Program Files\Java 目录。
右击计算机 → 属性 → 高级系统设置 → 高级 → 环境变量,我们选择在系统变量中配置,如下图:
点击新建按钮,输入变量名为 Java_Home,变量值为 D:\Program Files\Java\jdk1.8.0_91,点击确定。
在系统变量中找到 Path 变量,选中后点击编辑按钮,在编辑环境变量窗口处点击右侧新建按钮,然后加入 %Java_Home%\bin;%Java_Home%\jre\bin,点击确定;
回到系统变量,点击新建,输入变量名 CLASSPATH ,变量值,.;%Java_Home%\bin;%Java_Home%\lib\dt.jar;%Java_Home%\lib\tools.jar(注意:第一个分号前面有一个点),点击确定。
win+R(组合按键),输入 cmd 回车,打开命令窗口输入输入 java -version,显示 java 版本则成功。
a.编写第一个程序
DK 中没有提供 Java 编辑器,需要使用者自己选择一个方便易用的编辑器或集成开发工具。作为初学者,可以使用记事本、Notepad++、UltraEdit、EditPlus 作为 Java 编辑器,编写第一个 Java 程序。在实验楼的环境中,就基于 WebIDE 来编辑 Java 程序。下面使用 WebIDE 编写 HelloWorld 程序。
首先需要新建一个 Java 文件。这里有两种办法,一种是基于 Linux 系统下的 shell 命令方式:
touch HelloWorld.java
另一种就是大家都很熟悉的 右键-新建文件 这种方式,在 WebIDE 左侧 EXPLORER 栏,点击右键,选择 New File, 然后输入文件名 HelloWorld.java:
最后可以看到 HelloWorld.java 创建完成:
之后我们写入以下代码:
public class HelloWorld{
public static void main(String[] arg){
System.out.println("HelloWorld!");
}
}
输入下列命令
javac HelloWorld.java
java HelloWorld
b.HelloWorld详解
代码书写的基本规则
Java 源文件以 .java为扩展名。源文件的基本组成部分是类(class),如本例中的 HelloWorld 类。类的概念以后会介绍,读者在这里将其理解为一种格式就好。
一个源文件中最多只能有一个 public 类(但不是必须的)。如果源文件包含一个 public 类,则该源文件必须以 public 类名命名。本例中 HelloWorld 被声明为 public class 所以源文件必须命名为HelloWorld.java,如果去掉 public,那么源文件可以采用别的命名。
Java 程序的执行入口是 main() 方法,它有固定的书写格式:
public static void main(String[] args){…}
HelloWorld 的编写步骤
HelloWorld.java 这个程序的作用是向控制台输出 HelloWorld!。程序虽然非常简单,但其包括了一个 Java 程序的基本组成部分。以后编写 Java 程序,都是在这个基本组成部分上增加内容。下面是 HelloWorld 的编写步骤:
public class HelloWorld{
}
Java 程序的基本组成部分是类,这里给类取名为 HelloWorld ;类的取名有一定的规则,我们将在第 2 章介绍。因为前面有 public(公共的)修饰,所以程序源文件的名称必须和类名一致。类名后面有一对大括号,它划定了类的边界,所有属于这个类的代码都写在这对大括号里面。
public static void main(String[] args){
}
一个程序运行起来需要有个入口,main() 方法就是 Java 程序的入口,也就是程序运行的起始点。需要注意的是,一个程序只能有一个 main() 方法,否则 Java 虚拟机不知道从哪个 main() 方法开始运行。 编写 main() 方法时,按照上面的格式和内容书写即可,内容不能缺少,顺序也不能调整,对具体的各个修饰符(public static void)的作用,将会在后面的课程中详细介绍。main() 方法后面也有一对大括号,Java 代码写在这对大括号里,Java 虚拟机从这对大括号里按顺序执行代码。
System.out.println("HelloWorld!");
注意分号(;)是不可缺少的。System.out.println("*********"); 语句的作用很简单,就是向控制台输出括号内双引号内的 *********,输出之后自动换行。前面已经说过,JDK 包含了 Java API 供自定义程序调用,这个语句就调用了 Java API。如果程序员希望向控制台输出内容后不自动换行,则使用语句 System.out.print(“想输出的内容”)。
Java 注释
为什么要有注释呢?
假设一个程序员新进入一个项目组,接手一个已离职程序员未完成的软件模块功能,当他打开原程序员编写的代码时,其中一个方法(或函数)有上百行代码但没有任何注释,这样造成的结果是,新程序员要花费很长的时间去理解原程序员的业务逻辑和思路,可能还会出现理解错误的情况。怎么解决这个问题呢?就是给程序添加必要的注释。
什么是注释?
Java 程序中的注释是方便程序阅读而写的一些说明性的文字,这些文字不会被视为代码来编译和执行。通过注释提高 Java 源代码的可读性,使得 Java 程序条理清晰,易于理解。
Java 的注释有三种:单行注释、多行注释、文档注释。
//注释一行
/* ...... */ 注释若干行
/** ...... */ 注释若干行,并写入 javadoc 文档
下面介绍 Java 程序员编写注释的规范。
String engName = "颜群"; //工程师用户名
/**
* Copy Right Information : lan-qiao
* Project : blue-bridge
* JDK version used : jdk1.8.101
* Author : YQ
* Version : 2.1.0,2020/5/20
*/
/**
* Description :对方法进行描述
* @param Hashtable 参数描述1
* @param OrderBean 参数描述2
* @return String 返回值描述
* @exception IndexOutOfBoundsException 对方法可能抛出的异常进行描述
*/
public String checkout(HashTable cart,OrderBean orderBean) throws IndexOutOfBoundsException{
// 省略具体内容
}
@author,位置:类,标明开发该类模块的作者
@version,位置:类,标明该类的版本。
@see,位置:类、属性、方法,说明相关主题。
@param,位置:方法,对方法中某参数的说明。
@return,位置:方法,对方法返回值的说明。
@exception,位置:方法,对方法可能抛出的异常进行说明。
如下程序是为 HelloWorld 增加注释后的完整程序:
/**
* Copy Right Information : lan-qiao
* Project : blue-bridge
* JDK version used : jdk1.8.101
* Author : YQ
* Version : 2.1.0, 2020/5/1
*/
public class HelloWorld{
/**
* Description: 主函数,程序入口
* @param String[] args
* @return void
*/
public static void main(String[] args){
System.out.println("HelloWorld!"); //输出HelloWorld!到控制台
}
}
由于现在我们书写的代码量还较少,读者不清楚类、方法、参数等概念的含义,因此对于注释只需了解并尽量使用,待积累了一定的代码量后再回头来研究这部分内容。
除了正确的代码以外,优秀的程序还需要遵循一定的编写风格。
用 {} 括起来的代码,称为一个代码块,多个代码块之间可以嵌套。在嵌套时,同一层次中的代码,需要垂直对齐;内层的代码,需要和外层的代码间隔一定的缩进(通常,一个 tab 位表示一个缩进),如下程序所示:
public class Demo {
//main代码块与上层的Demo保持缩进
public static void main(String[] args) {
System.out.println("hello");
System.out.println("world");
System.out.println("hello world");
//if代码块与上层的main保持缩进
if(2>1){//if是后续会学习的选择结构
System.out.println("hello");
System.out.println("if");
System.out.println("hello if");
}
}
}
标识代码块开始的 { 是写在了当前行代码的最后侧,这属于一种编写风格。除此以外,另一种代码编写风格是将 { 写在新的一行,之后需要与结束符 } 垂直对齐,如下程序:
public class Demo2
{
public static void main(String[] args)
{
//...
if (2 > 1)//if是后续会学习的选择结构
{
//...
}
}
}
这里展示了两种花括号风格,但是对于缩进的要求是一致的,良好的缩进会清晰地呈现代码结构。
集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,它通常集成了代码编写、错误分析与提示、编译、运行、调试等功能,不像记事本只提供了代码编写功能。以下是常见的 Java 集成开发环境。
链接:https://pan.baidu.com/s/1qWuti6l9F0iKfdRF6_HRfQ
提取码:3673
根据上面的内容进行一些关于Java的简单操作