1 Java 语言概述
1.1 Java 概述
- 是
SUN
(Stanford University Network,斯坦福大学网络公司 )1995年
推出的一门高级编程语言。 - 是一种面向 Internet 的编程语言。Java 一开始富有吸引力是因为 Java 程序可以在
Web浏览器
中运行。这些Java程序被称为Java小程序
(applet),内嵌在 HTML 代码中。 - 伴随着互联网的迅猛发展,以及 Java 技术在 web 方面的不断成熟,已经成为 Web 应用程序的首选开发语言。
1.2 Java 技术体系平台
[!danger] Android 开发不等同于 Java ME 的开发
- Java SE (Java Standard Edition) 标准版
- 支持面向
桌面级应用
(如Windows下的应用程序) 的 Java 平台,即定位个人计算机的应用开发。 - 包括用户界面接口 AWT 及 Swing,网络功能与国际化、图像处理能力以及输入输出支持等。
- 此版本以前称为 J2SE
- 支持面向
- Java EE (Java Enterprise Edition) 企业版
- 为开发企业环境下的应用程序提供的一套解决方案,即定位
在服务器端的Web应用开发
。 - JavaEE 是 JavaSE 的扩展,增加了用于服务器开发的类库。如:Servlet 能够延伸服务器的功能,通过请求-响应的模式来处理客户端的请求;JSP 是一种可以将 Java 程序代码内嵌在网页内的技术。
- 版本以前称为 J2EE
- 为开发企业环境下的应用程序提供的一套解决方案,即定位
- Java ME (Java Micro Edition) 小型版
- 支持 Java 程序运行在
移动终端(手机、机顶盒)上的平台
,即定位在消费性电子产品的应用开发。 - JavaME 是 JavaSE 的内伸,精简了 JavaSE 的核心类库,同时也提供自己的扩展类。增加了适合微小装置的类库:javax.microedition.io.* 等。
- 此版本以前称为 J2ME
- 支持 Java 程序运行在
1.3 Java 开发环境搭建
1.3.1 JDK 🆚 JRE 🆚 JVM
- JDK (
J
avaD
evelopmentK
it):是 Java 程序开发工具包,包含JRE
和开发人员使用的工具。 - **JRE ** (
J
avaR
untimeE
nvironment):是 Java 程序的运行时环境,包含JVM
和运行时所需要的核心类库
。 - JVM (
J
avaV
irtualM
achine ,Java虚拟机):是个虚拟的计算机,具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。- Java 代码都运行在 JVM 之上,是 JVM 使得 Java 程序具备了跨平台性
- JVM 负责进行内存的管理 (内存分配与回收)❗️虽然但是,Java 程序仍可能出现内存溢出和内存泄漏问题
🌰 Java 8.0 Platform:
[!note] 小结
JDK = JRE + 开发工具集(例如Javac编译工具等)
JRE = JVM + Java SE 标准类库
1.3.2 JDK 版本选择
- JRebel 于 2022 年 4 月前后发布的《2022 年Java生态系统状况报告》中,Java11占比最多,其次是 Java8。
- Spring Boot 3.0 需要使用 java17 和 spring6.0,所以如果企业选型最新 springboot3. 0作为架构,则需使用 jdk17。
2020年 Java8 的占比还是最高的,可能是因为 Java11及更高版本的默认 GC 采用 G1 算法,而 Java8 不是。 (G1是最受欢迎的GC算法)
1.3.3 JDK 环境配置
官方下载地址
macOS 需下载 dmg 扩展,按照指引安装后,默认安装目录为 /Library/Java/JavaVirtualMachines
。
jdk-1.8.jdk/Contents/Home 中,bin 目录存放的是开发工具、lib目录存放的是 jar 包,src 目录存放的是源码。
# 1 查看当前环境变量
export# 2 配置环境变量, .zshrc 或者 .zprofile 都行
$ vim ~/.zshrcJAVA_HOME_8=/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home
JAVA_HOME_11=/Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
export JAVA_HOME=JAVA_HOME_8
PATH="$PATH:$JAVA_HOME/bin"# ==== 则通过命令 jdk8 或者 jdk11 切换版本 ====
alias jdk8="export JAVA_HOME=$JAVA_HOME_8 && echo current JDK has switched to oracle jdk version 1.8. && java -version"
alias jdk11="export JAVA_HOME=$JAVA_HOME_11 && echo current JDK has switched to openjdk version 11. && java -version"$ source ~/.zshrc# 3 查看是否配置成功
$ java -version
java version "1.8.0_381"
Java(TM) SE Runtime Environment (build 1.8.0_381-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.381-b09, mixed mode)# (optional) 切换 jdk 版本
$ jdk8
current JDK has switched to oracle jdk version 1.8.
java version "1.8.0_381"
Java(TM) SE Runtime Environment (build 1.8.0_381-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.381-b09, mixed mode)
2 Java 开发
Java程序开发三步骤:编写、编译、运行。
- 将 Java 代码编写到扩展名为 .java 的源文件中
- 通过 javac 命令对该 java 文件进行编译,生成一个或多个字节码文件
- 通过 java 命令对生成的 class 文件进行运行
[!danger] 注意点
- 一个源文件可包含多个类,但只能有一个 public 类;且要求源文件名与 public 类名一致,否则编译报错
- 一个源文件包含多个类时,编译后会生成多个
.class
字节码文件- main 方法是 Java 程序的入口,必须写在 public 类中,这样 JVM 才能从外部调用它
2.1 命令行编译运行
// HelloWorld.java
public class HelloWorld {public static void main(String[] args) {System.out.println("HelloWorld!!");}
}
$ javac HelloWorld.java # javac 源文件名,可通过 -encoding utf-8 指定源文件的字符编码
$ java HelloWorld # java 主类名
2.2 文档注释
文档注释内容可以被 JDK 提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。
/**
文档注释。这是我的第一个Java程序!^_^
@author songhk
@version 1.0
*/
public class HelloWorld{/**Java程序的入口@param args main方法的命令参数*/public static void main(String[] args){System.out.println("hello");}
}
$ javadoc -d mydoc -author -version HelloWorld.java
3 JVM 的内存划分
为 JVM 提高运算效率,对内存空间进行了不同区域的划分,每一片区域都有特定的处理数据方式和内存管理方式。
区域名称 | 作用 |
---|---|
虚拟机栈 |
用于存储正在执行的每个 Java 方法的局部变量表等。 局部变量表存放了编译期可知长度的各种基本数据类型、对象引用 (reference 类型,它不等同于对象本身,是对象在堆内存的首地址),方法执行完自动释放。 |
堆内存 |
存储对象实例 (包括数组对象),new来创建的,都存储在堆内存。 |
方法区 |
存储已被虚拟机加载的类信息、常量、(静态变量)、即时编译器编译后的代码等数据。 |
本地方法栈 | 当程序中调用了 native 的本地方法时,本地方法执行期间的内存区域。 |
程序计数器 | 程序计数器是 CPU 中的寄存器,它包含每一个线程下一条要执行的指令的地址。 |