1、历史背景
20 世纪 90 年代初,James Gosling(SUN 公司,已被 Oracle 收购)开发。
一门面向对象的编程语言。
- 最初命名 Oak(橡树),目标是针对小型家电设备的嵌入式应用,结果市场没啥反响。
- 互联网的崛起让 Oak 焕发生机,SUN 公司改造 Oak 并于 1995 年以 Java 名称正式发布(原因是 Oak 已经被人注册)。
- 随着互联网的高速发展,Java 渐成为最重要的网络编程语言。
2、特点
2.1、语言
2.1.1、特点
编译型 & 解释型
- 编译型语言:如 C、C++。
- 代码直接编译成机器码执行。
- 不同平台(X86、ARM 等)CPU 指令集不同,因此需要为每种平台编译对应的机器码。
- 解释型语言:如 Python、Ruby。
- 由解释器直接加载源码并运行。
- 运行效率太低。
Java:一门面向对象的编程语言,介于编译型语言和解释型语言之间。
- 将代码编译成字节码,类似于抽象的CPU指令。
- 只需要针对不同平台编写 JVM(虚拟机),JVM 负责加载字节码并执行,实现“一次编写,到处运行”的效果。
- Java 具有跨平台性,JVM 与平台相关。为保证不同平台、不同公司开发的虚拟机都能正确执行Java字节码,SUN公司制定了一系列 JVM 规范。
- 从实践的角度看,JVM的兼容性做得非常好,低版本的Java字节码完全可以正常运行在高版本的JVM上。
2.1.2、对比
- 静态语言:运行时结构不可变,如 Java、C、C++。
- 动态语言:运行时可以改变结构,如 Object-C、C#、JS、PHP、Python。
JS
JS | Java | |
---|---|---|
含义 | 基于对象的脚本语言,提供了丰富的内部对象 | 面向对象,需要涉及对象 |
执行 | 浏览器解释执行 | 先编译为字节码,通过解释器或编译器转为机器码 |
变量类型 | 弱类型,无需声明,解释器在运行时检查数据类型 | 强类型,需实现声明变量类型 |
动态联编,对象引用在运行时检查 | 静态联编,对象引用在编译时进行 |
C
C | Java | |
---|---|---|
面向 | 面向过程 (C++、C# 支持面向对象) |
面向对象 |
执行 | (编译式语言) 编译、链接后生成机器码 |
(解释性语言) 编译成字节码文件,由解释器解释执行,热点代码由 JIT 编译成机器码 |
跨平台 | ❌ | ✔ |
指针、运算符重载 | ✔ | ❌ |
多重继承 | ✔ | ❌,只支持多重实现 |
内存管理 | 可直接操作内存,需要对内存进行显式管理 | 无法直接操作内存,GC 机制自动内存管理 |
数据类型所占字节数 | 在不同平台不固定 | 固定 |
Python
Python | Java | |
---|---|---|
效率 | 方便调用 C 语言函数 或 C++ 库 | 虚拟机比 Python 强大 |
偏向 | 数据分析 | 商业开发 |
语言 | 弱类型(动态) | 强类型(静态) |
执行 | 直接运行 | 先编译为字节码,通过解释器或编译器转为机器码 |
变量 | 不需要声明 | 需要声明 |
2.2、版本
2.2.1、不同版本
- Java EE(Enterprise):SE 的基础上添加 API 和库,方便开发 web 应用、数据库、消息服务等。
- Java SE(Standard):包含标准的 JVM 和标准库。
- Java ME(Micro):针对嵌入式设备的微版本。
- SE 的标准库无法在 ME 上使用,JVM 也是“瘦身版”。
- 没有真正流行,不建议学习。
2.2.2、版本号
发布时间线
1995 发布 1.0,目前最新版本 19。
时间 | 版本 |
---|---|
1995 | 1.0 |
1998 | 1.2 |
2000 | 1.3 |
2002 | 1.4 |
2004 | 1.5 / 5.0 |
2005 | 1.6 / 6.0 |
2011 | 1.7 / 7.0 |
2014 | 1.8 / 8.0 |
2017/9 | 1.9 / 9.0 |
2018/3 | 10 |
2018/9 | 11 |
2019/3 | 12 |
2019/9 | 13 |
2020/3 | 14 |
2020/9 | 15 |
2021/3 | 16 |
2021/9 | 17 |
2022/3 | 18 |
2022/9 | 19 |
版本新功能
- 5
- 泛型
- 枚举,switch 枚举
- 自动装拆箱
- foreach 循环
- 可变参数
- 静态导入(无需指定类名,直接调用静态结构,前提是导包)
- 内省
- 6:GUI
- 7
- switch-字符串
- 泛型集合:泛型实例化类型自动推断。
- 集合增强:直接用中括号、大括号进行初始化。
- multi-catch:单个 catch 捕获多个异常类型,用
|
隔开 - twr:在 try 括号内,指定要使用和自动释放的资源
- 8
- 接口默认方法:使用 default 关键字,实现方法
- lambda 表达式
2.3、名词解释
JRE & JDK
- JRE(Java Runtime Environment):JVM + Runtime Library
- JDK(Java Development Kit):JRE + Compiler, debugger, etc
JSR & JCP
- JSR(Java Specification Request):为保证 Java 语言规范性而提出。在 Java 平台上开发功能之前,需要创建 JSR 以定义接口规范。
- JCP 组织(Java Community Process):负责审核 JSR 的组织。
RI & TCK
一个 JSR 规范发布时,需要同时发布一个 RI 和 TCK 以供参考。
- RI(Reference Implementation)
- TCK(Technology Compatibility Kit)
示例:有人提议开发某个功能 A,需要贴出能跑的代码(RI);为了保证不同人所开发的 A 的接口、功能完全相同,需要提供相关的测试套件(TCK)。
通常,RI 只是“能跑”的正确代码,不追求性能。因此,RI 仅作为参考,不会作为最终使用的产品。
3、安装
3.1、安装步骤
以 Windows 为例
-
Oracle 官网:找到需要的版本,下载安装。
-
配置环境变量:
变量 值 备注 JAVA_HOME JDK 安装路径 新增变量,提供给其它程序使用 Path %JAVA_HOME%\bin 新增值,在任意路径都可以运行 Java -
验证:打开命令提示符窗口(CMD),确认输出正确的 Java 版本。
java -version
3.2、目录介绍
3.2.1、目录
- bin 目录:二进制执行文件(
.exe
)- javac:Java 编译器。将 Java 源文件(
.java
)编译为字节码文件(.class
)。 - java:启动 JVM 进程。用于执行字节码文件(
.class
)。 - jar:打包工具。将一组字节码文件(
.class
)打包成一个.jar
文件,便于发布。 - javadoc:文档生成工具。从源码中自动提取注释并生成文档。
- jdb:Java 调试器。用于开发阶段的运行调试。
- ...
- javac:Java 编译器。将 Java 源文件(
- db 目录:小型数据库 JavaDB。
- include 目录:存放开放 JDK 使用的 C 语言的头文件。
- jre 目录:JRE 根目录,包含 bin 目录(含 JVM)、lib 目录(基础类库),但不包含开发工具。
- lib 目录:Java 类库或库文件。
3.2.2、文件
- src.zip:JDK 核心类源码
- javafx-src.zip:JavaFX 源码
4、Java 编程
4.1、Hello World
-
编写代码:新建文本文档 Hello.java,输入以下代码。
public class Hello { public static void main(String[] args) { System.out.println("Hello World!"); } }
-
编译:进入 Hello.java 所在目录的命令行提示符(CMD),输入以下命令。
# 成功执行后,当前目录会生成 Hello.class javac Hello.java
-
运行:输入以下命令,运行 Hello.class 文件。
(Java 11+ 可直接运行单个 Java 文件,即
java Hello.java
)# 不需要输入后缀 java Hello
4.2、IDE
集成开发环境(Integrated Development Environment)
好处:将项目开发涉及的操作集成到一个环境中,简化人工操作,提高开发效率。
- 开发:提示和自动补全,快速插入模板代码块。
- 编译运行:支持自动编译和运行。
- 调试:支持断点调试。
- ...
Java 常用 IDE