JavaSE学习随笔

发布时间 2023-12-19 23:14:41作者: termsw

# JavaSE学习随笔

![image-20231219225944637](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230848237-931389217.png)

[TOC]

***

## 1 Java语言概述

### 1.1 Java 概述

- 是*SUN*(Stanford University Network,斯坦福大学网络公司 ) *1995年*推出的一门高级编程语言。
- 是一种面向Internet的编程语言。Java一开始富有吸引力是因为Java程序可以在*Web浏览器*中运行。这些Java程序被称为*Java小程序*(applet),内嵌在HTML代码中。
- 伴随着互联网的迅猛发展,以及Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。

 

### 1.2 Java 语言简史

**起步阶段:**

1991年,Sun公司的工程师小组想要设计一种语言,应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些设备的处理能力和内存都很有限,并且不同的厂商会选择不同的中央处理器(CPU),因此这种语言的关键是代码短小、紧凑且与平台无关(即不能与任何特定的体系结构捆绑在一起)。

Gosling团队率先创造了这个语言,并命名为“Oak"(起名的原因是因为他非常喜欢自己办公室外的橡树)。后因智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。

随着20世纪90年代互联网的发展,Sun公司发现该语言在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。(Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名。)

![image-20231219102347737](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230847865-319975051.png)

**发展阶段:**

| 发行版本 | 发行时间 | 备注 |
| ------------------- | -------------------- | ------------------------------------------------------------ |
| Java 1.0 | 1996.01.23 | Sun公司发布了Java的第一个开发工具包 |
| Java 1.1 | 1997.02.19 | JavaOne会议召开,创当时全球同类会议规模之最。 |
| Java 1.2 | 1998.12.08 | Java拆分成:J2SE(标准版)、J2EE(企业版)、J2ME(小型版) |
| Java 1.3 | 2000.05.08 | |
| Java1.4 | 2004.02.06 | |
| ***\*Java 5.0\**** | ***\*2004.09.30\**** | ***\*①版本号从1.4直接更新至5.0;②平台更名为JavaSE、JavaEE、JavaME\**** |
| Java 6.0 | 2006.12.11 | 2009.04.20 Oracle宣布收购SUN公司 |
| | 2009.04.20 | Oracle公司收购SUN,交易价格*74亿*美元。 |
| Java 7.0 | 2011.07.02 | |
| ***\*Java 8.0\**** | ***\*2014.03.18\**** | ***\*此版本是继Java 5.0以来变化最大的版本。是长期支持版本(LTS)\**** |
| Java 9.0 | 2017.09.22 | ①此版本开始,***\*每半年更新一次\****;②Java 9.0开始不再支持windows 32位系统 |
| Java 10.0 | 2018.03.21 | |
| ***\*Java 11.0\**** | ***\*2018.09.25\**** | ***\*JDK安装包取消独立JRE安装包,是长期支持版本(LTS)\**** |
| Java 12.0 | 2019.03.19 | |
| ... | ... | |
| ***\*Java17.0\**** | ***\*2021.09\**** | ***\*发布Java 17.0,版本号也称为21.9,是长期支持版本。\**** |
| ... | ... | |
| Java19.0 | 2022.09 | 发布Java19.0,版本号也称为22.9。 |

 

### 1.3 Java 之父

![image-20231219102642073](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230847456-1909774014.png)

詹姆斯·高斯林(James Gosling)先生以“Java 技术之父”而闻名于世。他是Java 技术的创始人,他亲手设计了Java语言,并开发了Java编译器和Java虚拟机,使Java成为了世界上最流行的开发语言。

James Gosling于1984 年加入Sun公司,并一直服务于Sun公司,直至2010年前后,Sun被Oracle并购而加入Oracle,担任客户端软件集团的首席技术官; 2010年4月从Oracle离职。

 

### 1.4 Java 技术体系平台

**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程序运行在*移动终端(手机、机顶盒)上的平台*,即定位在消费性电子产品的应用开发。注意:Android开发不等同于Java ME开发
- JavaME是JavaSE的内伸,精简了JavaSE 的核心类库,同时也提供自己的扩展类。增加了适合微小装置的类库:javax.microedition.io.*等。
- 此版本以前称为J2ME

![image-20231219103428444](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230847036-598504487.png)

 

 

## 2 Java 开发环境搭建

 

### 2.1 JDK JRE

- **JDK** (*J*ava *D*evelopment *K*it):是Java程序开发工具包,包含*JRE* 和开发人员使用的工具。
- **JRE** (Java Runtime Environment) :是Java程序的运行时环境,包含**JVM** 和运行时所需要的核心类库。

如下是Java 8.0 Platform:

![image-20231219104243072](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230846632-304680584.png)

![image-20231219104350709](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230846216-135257710.png)

简单来说,

​ **JDK = JRE + 开发工具集**(例如Javac编译工具等)

​ **JRE = JVM + Java SE标准类库**

 

### 2.2 JDK版本的选择

- 大多数java程序员都选择长期支持的版本,例如jdk8、jdk11、jdk17、jdk21
- 根据个人或企业需求选用jdk的版本

| 发行版本 | 发行时间 | 备注 |
| ------------------- | -------------------- | ------------------------------------------------------------ |
| Java 1.0 | 1996.01.23 | Sun公司发布了Java的第一个开发工具包 |
| Java 1.1 | 1997.02.19 | JavaOne会议召开,创当时全球同类会议规模之最。 |
| Java 1.2 | 1998.12.08 | Java拆分成:J2SE(标准版)、J2EE(企业版)、J2ME(小型版) |
| Java 1.3 | 2000.05.08 | |
| Java1.4 | 2004.02.06 | |
| ***\*Java 5.0\**** | ***\*2004.09.30\**** | ***\*①版本号从1.4直接更新至5.0;②平台更名为JavaSE、JavaEE、JavaME\**** |
| Java 6.0 | 2006.12.11 | 2009.04.20 Oracle宣布收购SUN公司 |
| | 2009.04.20 | Oracle公司收购SUN,交易价格*74亿*美元。 |
| Java 7.0 | 2011.07.02 | |
| ***\*Java 8.0\**** | ***\*2014.03.18\**** | ***\*此版本是继Java 5.0以来变化最大的版本。是长期支持版本(LTS)\**** |
| Java 9.0 | 2017.09.22 | ①此版本开始,***\*每半年更新一次\****;②Java 9.0开始不再支持windows 32位系统 |
| Java 10.0 | 2018.03.21 | |
| ***\*Java 11.0\**** | ***\*2018.09.25\**** | ***\*JDK安装包取消独立JRE安装包,是长期支持版本(LTS)\**** |
| Java 12.0 | 2019.03.19 | |
| ... | ... | |
| ***\*Java17.0\**** | ***\*2021.09\**** | ***\*发布Java 17.0,版本号也称为21.9,是长期支持版本。\**** |
| ... | ... | |
| Java19.0 | 2022.09 | 发布Java19.0,版本号也称为22.9。 |
| ... | ... | |

 

### 2.3 JDK 的下载

- 下载网址(Oracle公司官网):www.oracle.com

- 下载步骤:

- 在官网底部选择Developers开发者

![image-20231219110118534](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230845771-1725425727.png)

- 在Developers页面的顶部,选择Downloads,单击进入后点击Java SE,如图所示:

![image-20231219111239119](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230845203-334235893.png)

![image-20231219111331670](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230844787-538125738.png)

- 这里展示的是最新的几个Java版本,例如jdk21、jdk17。单击Java archive,然后选择需要的版本下载。

![image-20231219111616578](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230844366-628506894.png)

![image-20231219111653356](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230843874-1440665196.png)

- 注意:需要注册Oracle公司官网的账号才能进行下载。

 

### 2.4 JDK 的安装

**安装说明:**

- 安装路径不要有中文或者空格等特殊符号。
- 以安装JDK8 和 JDK17作为例子,安装步骤如下。

**安装步骤:**

1. 双击*jdk-17_wi*:*ndows-x64_bin.exe*文件,并单击下一步,如下

![image-20231219113357430](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230843440-753460264.png)

2. 修改安装路径,单击更改,如下

![image-20231219113438766](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230843064-2028283298.png)

3. 将安装路径修改为你想安装的路径下并记住该详细路劲,例如我的安装路径D:\develop_tools\jdk\jdk-17.0.2\,并单击下一步开始安装,如下(当系统盘空间足够大时也可以选择默认路径安装)

![image-20231219113648250](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230842686-763993967.png)

4. 等待安装完成即可

 

### 2.5 配置path环境变量

#### 2.5.1 path环境变量是什么?

window操作系统执行命令时,所要搜寻的路径。

 

#### 2.5.2 为什么需要配置path环境变量

希望在命令行使用javac.exe等工具时,任意目录下都可以找到这个工具所在的目录。

 

#### 2.5.3 配置 path环境变量

1. 打开桌面上的计算机-->进入后在左侧找到此电脑-->单击鼠标右键-->选择属性-->选择高级系统设置-->在高级选项卡,单击**环境变量**

![image-20231219115543027](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230842255-123565306.png)

![image-20231219115621387](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230841864-1269598362.png)

2. 在系统变量中,单击新建 ,创建新的环境变量,如图所示:

![image-20231219122030798](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230841443-204843325.png)

3. 变量名输入**JAVA_HOME**,变量值输入D:\Java\JDK\jdk1.8.0_271(注意:这里是jdk的安装路径),单击确定,如图所示:

![image-20231219122325486](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230841110-1897148055.png)

4. 选中Path 环境变量,双击或者点击编辑 ,如图所示:

![image-20231219122442610](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230840746-962368780.png)

5. 在变量值的最前面,键入%JAVA_HOME%\bin。如图所示:

![image-20231219122607579](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230840401-451504320.png)

6. 环境变量配置完成,重启DOS命令行,在任意目录下输入javac 或java命令或java -version,运行成功。

![image-20231219123212189](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230839989-1639208461.png)

7. *引用理解*

> ![image-20231219123318214](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230839609-1796858147.png)

 

#### 2.5.4 JDK17配置方案:自动配置

不管大家有没有提前安装JDK8或其它版本JDK,在我们安装完JDK17之后,理应按JDK8的方式配置path环境变量。但是,我们发现在安装完JDK17以后,配置环境变量之前,执行CMD指令:

![image-20231219124237363](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230839240-1554925861.png)

**原因:JDK17在安装之后,自动进行了环境变量的配置。**如下:

![image-20231219124346300](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230838874-1318193288.png)

这里之前安装jdk8设置的JAVA_HOME路径未修改的话,将path中的%JAVA_HOME%\bin上移到首位,会发现系统所找的还是jdk8版本。

![image-20231219124946722](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230838521-1116872490.png)

![image-20231219125018287](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230838196-2118281290.png)

![image-20231219125144961](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230837866-1370593038.png)

![image-20231219125116788](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230837515-2026469158.png)

**小结:**

- 安装了多个版本jdk时,可以通过修改系统变量值中JAVA_HOME的变量值来使用指定的jdk版本,或者通过调整Path中的对应版本的配置先后顺序来使用对应版本的jdk。

 

 

## 3 开发体验:HelloWorld

JDK安装完毕,我们就可以开发第一个Java程序了,习惯性的称为:HelloWorld。

### 3.1 开发步骤

Java程序开发三步骤:**编写、编译、运行**

- 将 Java 代码编写到扩展名为 .java 的源文件中
- 通过 javac.exe 命令对该 java 文件进行编译,生成一个或多个字节码文件
- 通过 java.exe 命令对生成的 class 文件进行运行

![image-20231219132522219](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230837153-1244944791.png)

### 3.2 编写

1. 新建文本文件,文件名修改为*HelloWorld.java*,其中文件名为*HelloWorld*,后缀名必须为*.java*。

![image-20231219132738678](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230836789-171797940.png)

2. 用记事本或editplus等文本编辑器打开(虽然记事本也可以,但是没有关键字颜色标识,不利于初学者学习)

3. 在文件中输入如下代码,并且保存:

``` java
class HelloWorld {
public static void main(String[] args) {
System.out.println("HelloWorld!!");
}
}
```

### 3.3 编译

在DOS命令行中,进入D:\code\javacode\chapter01目录,使用javac 命令进行编译。

命令:
**javac Java源文件名.后缀名java**

![QQ截图20231219134058](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230836435-767894671.png)

编译成功后,命令行没有任何提示。打开D:\code\javacode\chapter01目录,发现产生了一个新的文件 HelloWolrd.class,该文件就是编译后的文件,是Java的可运行文件,称为**字节码文件**,有了**字节码文件**,就可以运行程序了。

![QQ截图20231219134331](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230836103-967137034.png)

### 3.4 运行

在DOS命令行中,在字节码文件目录下,使用java 命令进行运行。

命令:
java 主类名字
主类是指包含main方法的类,main方法是Java程序的入口:

**运行:**

​ java HelloWorld

![QQ截图20231219134649](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230835772-790192143.png)

 

 

## 4 Java 开发工具

- 文本开发工具

![image-20231219141729921](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230835414-1631219396.png)

- 集成开发工具

![image-20231219141755885](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230835015-674323017.png)

 

 

## 5 注释

### 5.1 什么是注释?

- 源文件中用于解释、说明程序的文字就是注释。
- 注释是一个程序员必须要具有的良好编程习惯。实际开发中,程序员可以先将自己的思想通过注释整理出来,再用代码去体现。
- 在一个程序中,代码不存在逻辑错误、bug等问题,不写注释不影响程序的运行。
- **程序员写注释是必须的**,在计算机语言中,注释是计算机语言的一个重要组成部分,用于在源代码中解释代码的作用,可以增强程序的可读性,可维护性。
- Java 注释主要有三种类型:单行注释、多行注释、文档注释

### 5.2 单行注释

单行注释以双斜杠 // 开始:

~~~ java
//这是一个单行注释
public static void main(String[] args){

}
~~~

### 5.3 多行注释

多行注释以 /*开始,以 */结束:

~~~ java
/*
这是一个多行注释
可以用来注释多行代码
*/
int y = 20; // 初始化一个变量y为20
~~~

### 5.3 文档注释

文档注释以 /** 开始,以 */ 结束,通常出现在类、方法、字段等的声明前面,用于生成代码文档,这种注释可以被工具提取并生成 API 文档,如 JavaDoc。

~~~ java
/**
*这是一个文档注释示例
*它通常包含类、方法、字段的详细信息
*/
public class MyClass{
...
}
~~~

文档注释的格式通常包含一些特定的标签,如,@param 用于描述方法参数,@return 用于描述返回值,@throws 用于描述可能抛出的异常等等,这些标签有助于生成清晰的API文档,以便其他开发者能够更好地理解和使用你的代码。例子:

~~~java
/**
* ClassName: HelloWorld
* @Author termsw
* @Create 2023/12/19 9:05
* @Version 1.0
*/
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
~~~

**文档注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。**

**javadoc -d mydoc -author -version Java源文件名.后缀名java**

![image-20231219153839968](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230834621-145020009.png)

![image-20231219154022098](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230834285-517444745.png)

![image-20231219154041100](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230833939-398177443.png)

 

 

## 6 Java API文档

- API (Application Programming Interface,应用程序编程接口)是 Java 提供的基本编程接口。
- Java语言提供了大量的基础类,因此 Oracle 也为这些基础类提供了相应的说明文档,用于告诉开发者如何使用这些类,以及这些类里包含的方法。大多数Java书籍中的类的介绍都要参照它来完成,它是编程者经常查阅的资料。
- Java API文档,即为JDK使用说明书、帮助文档。
- 下载API文档:
- 在线看:https://docs.oracle.com/en/java/javase/17/docs/api/index.html
- 离线下载:https://www.oracle.com/java/technologies/javase-jdk17-doc-downloads.html

 

 

## 7 Java 核心机制:JVM

### 7.1 Java 语言的优缺点

Java确实是从C语言和C++语言继承了许多成份,甚至可以将Java看成是类C语言发展和衍生的产物。“青出于蓝,而胜于蓝”。

#### 7.1.1 Java语言的优点

**跨平台性:**这是Java的核心优势。Java在最初设计时就很注重移植和跨平台性。

- 通过Java语言编写的应用程序在不同的系统平台上都可以运行。“*Write once , Run Anywhere*”。
- 原理:只要在需要运行 java 应用程序的操作系统上,先安装一个Java虚拟机 (JVM ,Java Virtual Machine) 即可。由JVM来负责Java程序在该系统中的运行。

![image-20231219160418455](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230833389-241087426.png)

**面向对象性:**面向对象是一种程序设计技术,非常适合大型软件的设计和开发。面向对象编程支持封装、继承、多态等特性,让程序更好达到高内聚,低耦合的标准。

**健壮性:**吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制。

**安全性高:**Java适合于网络/分布式环境,需要提供一个安全机制以防恶意代码的攻击。如:安全防范机制(ClassLoader类加载器),可以分配不同的命名空间以防替代本地的同名类、字节代码检查。

**简单性:** Java就是C++语法的简化版,我们也可以将Java称之为“C++--”。比如:头文件,指针运算,结构,联合,操作符重载,虚基类等。

**高性能:**Java最初发展阶段,总是被人诟病“性能低”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免。Java语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如,通过JIT(JUST IN TIME)即时编译技术提高运行效率。Java低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多C++应用转到Java开发,很多C++程序员转型为Java程序员。

#### 7.1.2 缺点

- **语法过于复杂、严谨**,对程序员的约束比较多,与python、php等相比入门较难。但是一旦学会了,就业岗位需求量大,而且薪资待遇节节攀升。
- 一般适用于大型网站开发,整个架构会比较重,对于初创公司开发和维护人员的成本比较高(即薪资高),选择用Java语言开发网站或应用系统的需要一定的经济实力。
- 并非适用于所有领域。比如,Objective C、Swift在iOS设备上就有着无可取代的地位。浏览器中的处理几乎完全由JavaScript掌控。Windows程序通常都用C++或C#编写。Java在服务器端编程和跨平台客户端应用领域则很有优势。

 

### 7.2 JVM功能说明

**JVM(Java Virtual Machine ,Java虚拟机):**是一个虚拟的计算机,是**Java程序的运行环境**。JVM具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。

![image-20231219161101266](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230833045-529433869.png)

- 功能1:**实现Java程序的跨平台性**

我们编写的Java代码,都运行在JVM 之上。正是因为有了JVM,才使得Java程序具备了跨平台性。

![image-20231219161234734](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230832606-1409040072.png)

- 功能2:**自动内存管理(内存分配、内存回收)**
- Java程序在运行过程中,涉及到运算的**数据的分配*、*存储**等都由JVM来完成
- Java消除了程序员回收无用内存空间的职责。提供了一种系统级线程跟踪存储空间的分配情况,在内存空间达到相应阈值时,检查并释放可被释放的存储器空间。
- GC的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上**减少了**因为没有释放空间而导致的**内存泄漏**。
- **注意**:Java程序还会出现**内存溢出**和**内存泄漏**的问题

 

**练习:**

案例:个人信息输出(姓名,性别,家庭住址等)

~~~ java
public class PersonalInfo {
public static void main(String[] args) {
System.out.println("姓名:termsw");
System.out.println(""); //换行操作
System.out.println("性别:男");
System.out.println("家庭住址:xxxxxxx");
}
}
~~~

![image-20231219164336979](https://img2023.cnblogs.com/blog/2925811/202312/2925811-20231219230832079-1699520486.png)