一、初识 Java
在学习 Java 的主义内容之前,我们首选应该了解一些 Java 的背景知识。这样,我们可以对 Java 有些初步的了解,也可以让我们在与其他人聊 Java 时,能聊到一块儿去。
1 为什么要学习 Java
从互联网到企业平台,Java是应用最广泛的编程语言,原因在于:
Java是基于JVM虚拟机的跨平台语言,一次编写,到处运行;
Java程序易于编写,而且有内置垃圾收集,不必考虑内存管理;
Java虚拟机拥有工业级的稳定性和高度优化的性能,且经过了长时期的考验;
Java拥有最广泛的开源社区支持,各种高质量组件随时可用。
Java语言常年霸占着三大市场:
互联网和企业应用,这是Java EE的长期优势和市场地位;
大数据平台,主要有Hadoop、Spark、Flink等,他们都是Java或Scala(一种运行于JVM的编程语言)开发的;
Android移动平台。
这意味着Java拥有广泛的就业市场。
2 Java 背景知识
Java 是美国 sun 公司(Stanford University Network)在1995年推出的一门计算机高级编程语言。
Java 早期称为 Oak(橡树),后期改名为 Java。
Java 之父:詹姆斯·高斯林(James Gosling)。
2009 年 sun 公司被 Oracle(甲骨文)公司收购。
3 Java 技术体系
技术体现 | 说明 |
---|---|
Java SE(Java Standard Edition):标准版 | Java技术的核心和基础 |
Java EE(Java Enterprise Edition):企业版 | 企业级应用开发的一套解决方案 |
Java ME(Java Micro Edition):小型版 | 针对移动设备应用的解决方案 |
简单来说,Java SE就是标准版,包含标准的JVM和标准库,而Java EE是企业版,它只是在Java SE的基础上加上了大量的API和库,以便方便开发Web应用、数据库、消息服务等,Java EE的应用使用的虚拟机和Java SE完全相同。
Java ME就和Java SE不同,它是一个针对嵌入式设备的“瘦身版”,Java SE的标准库无法在Java ME上使用,Java ME的虚拟机也是“瘦身版”。
毫无疑问,Java SE 是整个 Java 平台的核心,而 Java EE 是进一步学习Web应用所必须的。我们熟悉的Spring等框架都是Java EE开源生态系统的一部分。
不幸的是,Java ME从来没有真正流行起来,反而是Android开发成为了移动平台的标准之一,因此,没有特殊需求,不建议学习Java ME。
4 Java 程序的跨平台原理
Java 有着 跨平台 的特点,即 “一次编译,处处运行”。比如:我们在 Windows 电脑上,开发的 Java 程序,可以直接在 Linux 或者 Mac 电脑上运行。
这得益于 Java 的编译和运行机制。
Java 源代码(.java)经过编译,生成字节码文件(.class),交由 Java 虚拟机(jvm)运行。只要让 JVM(Java Virtual Machine) 兼容不同系统,便可以在不同系统上,得到相同的运行结果,从而实现跨平台。
5 JDK 与 JRE
初学者学Java,经常听到JDK、JRE这些名词,它们到底是啥?
JDK:Java Development Kit
JRE:Java Runtime Environment
简单地说,JRE 就是运行 Java 字节码的虚拟机(JVM)和运行库的集合。但是,如果只有 Java 源码,要编译成 Java 字节码,就需要 JDK ,因为 JDK 除了包含 JRE ,还提供了编译器、调试器等开发工具。
二者关系如下:
要学习Java开发,当然需要安装JDK啦。安装 JDK ,也被称为 “搭建 Java 开发环境” 。
6 搭建 Java 开发环境
因为Java程序必须运行在JVM之上,所以,我们第一件事情就是安装JDK。
本系列教程,使用的 JDK 版本为 JDK20 。
安装 JDK 的流程,大概分为两种:
安装来自 Oracle 官网 的 JDK;
安装第三方 JDK。
6.1 安装 Oracle 官方 JDK
使用官方 JDK ,需要手动配置环境变量,比较麻烦,建议直接使用第三方 JDK。
前往 Oracle 官网 下载最新的稳定版JDK,下载安装即可。Windows优先选
x64 MSI Installer
,Linux和macOS要根据自己电脑的CPU是ARM还是x86选择合适的安装包。安装过程下一步就好,这里不再赘述。
设置环境变量。需要设置
JAVA_HOME
和PATH
两个环境变量。在 JDK1.5 前,还需要配置classpath
这一环境变量。
安装完JDK后,需要设置一个
JAVA_HOME
的环境变量,它指向JDK的安装目录。在Windows下,它是安装目录,类似:C:\Program Files\Java\jdk-20
然后,把
JAVA_HOME
的bin
目录附加到系统环境变量PATH
上。把
JAVA_HOME
的bin
目录添加到PATH
中是为了在任意文件夹下都可以运行java
。打开命令提示符窗口,输入命令java -version
,如果一切正常,你会看到如下输出:
如果你看到的版本号不是
20
,而是15
、1.8
之类,说明系统存在多个JDK,且默认JDK不是JDK 20,需要把JDK 20提到PATH
前面。如果你得到一个错误输出:
这是因为系统无法找到Java虚拟机的程序
java.exe
,需要检查JAVA_HOME和PATH的配置。
6.2 安装第三方JDK
提供 JDK 的组织有很多,本教程使用的是 bellsoft 提供的 LIBERICA JDK 20。
前往 LIBERICA JDK 官网,下载对应系统的 JDK 20 安装包
直接安装,全程下一步。
第三方 JDK 一般会自动配置环境变量,如果不需要安装多个版本 JDK ,我们不需要手动调整环境变量。
7 JDK所包含的重要可执行文件
在JAVA_HOME
的bin
目录下找到很多可执行文件:
java:这个可执行程序其实就是JVM,运行Java程序,就是启动JVM,然后让JVM执行指定的编译后的代码;
javac:这是Java的编译器,它用于把Java源码文件(以
.java
后缀结尾)编译为Java字节码文件(以.class
后缀结尾);jar:用于把一组
.class
文件打包成一个.jar
文件,便于发布;javadoc:用于从Java源码中自动提取注释并生成文档;
jdb:Java调试器,用于开发阶段的运行调试。
8 第一个 Java 程序
Java 程序的源代码文件(.java)实际上只是存储着满足 Java 语法内容的普通文本文件而已。因此,可以编写文本文件的软件,都可以编写 Java 源代码。
为了更好地了解 Java 程序的编写到运行的流程,让我们用 “记事本” 这个每个电脑都有的文本编辑程序来编写我们的第一个 Java 程序。
打开 “记事本” ,输入以下内容:
public class Hello { public static void main(String[] args) { System.out.println("Hello, world!"); } }
让我们简单理解一下上面的程序:
首先,我们使用
public class Hello{...}
语句,定义了一个 类(class) ,这里的类名是Hello
。 “类” 的具体功能,现在了解还为时尚早,但哪怕是最简单的 Java 程序,也需要使用到 “类” ,在现阶段,大家把 “类” 理解为程序的名称就可以。当然这是错误的概念,只是希望大家不要在现阶段过多关注 “类” 的概念。然后,我们使用
public static void main(String[] args) {...}
语句,定义了一个名为main
的方法 。“方法” 的概念,我们现阶段也不应太在意,但这段语句,有着独特的作用。Java规定,某个类定义的public static void main(String[] args)
是Java程序的固定入口方法,因此,Java程序总是从main
方法开始执行。注意到 Java 源码的缩进不是必须的,但是用缩进后,格式好看,很容易看出代码块的开始和结束,缩进一般是 4 个空格或者一个 tab 。
最后,当我们把代码保存为文件时,文件名必须是
Hello.java
。因为要和我们定义的类名Hello
完全保持一致。Java源码本质上是一个文本文件,我们需要先用
javac
把Hello.java
编译成字节码文件Hello.class
。在Hello.java
文件所在目录,打开 “终端” 执行以下命令:$ javac Hello.java
如果源代码无误,上述命令不会有任何输出,而当前目录下会产生一个
Hello.class
文件。执行
Hello.class
,使用命令java Hello
。执行成功后,得到的结果将显示在下一行。$ java Hello Hello, world!
注意:给虚拟机传递的参数
Hello
是我们定义的类名,虚拟机自动查找对应的class文件并执行。
9 Java 11 以后的新功能
实际上,我们直接运行java Hello.java
也是可以的:
$ java Hello.java
Hello, world!
这是 Java 11 新增的一个功能,它可以直接运行一个单文件源码!
需要注意的是,在实际项目中,单个不依赖第三方库的Java源码是非常罕见的,所以,绝大多数情况下,我们无法直接运行一个Java源码文件,原因是它需要依赖其他的库。
10 小结
一个Java源码只能定义一个
public
类型的class,并且class名称和文件名要完全一致;使用
javac
可以将.java
源码编译成.class
字节码;使用
java
可以运行一个已编译的Java程序,参数是类名。