Skip to content

一. Java 知识脉络图 ​

Java 基础全程脉络图 ​

Java基础全程脉络图

本章专题与脉络 ​

二. 抽丝剥茧话 Java ​

当前大学生就业形势 ​

麦可思研究院 发布了《2022年中国大学生就业报告》,针对2021届毕业生收入较高的本科专业排行榜:

麦可思研究院 发布过《2021年中国大学生就业报告》,应届本科毕业生就业数量较大的前十位行业类的就业质量:

报告还对毕业三年后的2017届毕业生所在十大行业进行了统计:

从国家统计局发布的2021年全国平均工资来看,不管在城镇非私营单位还是私营单位,IT业均为最高

IT互联网是否依旧靠谱 ​

过去不能代表未来!互联网是否依旧靠谱?

image-20220523002428542

2014 年至 2018 年间,我国网民规模从 6.49 亿增长为 8.29 亿,增幅为 27.5%。同一时间段,全国移动互联网接入的流量却从 20.6EB 增长到了 711.1EB,增幅达 3352%(获取和处理的信息量大幅增加)。

随着 5G 技术进一步拓宽移动互联网的速度和容量,产业互联网将在消费型流量的基础上创造生产型流量,根据报告的预测,至 2024 年,全国移动互联网的接入流量将达到 127663.8EB, 流量规模达到2018年的179.5倍。

当下,5G、物联网、人工智能、产业互联网都是国家政策大方向,需要大量能与机器对话的中高端人才。

IT行业岗位分析 ​

image-20220522234544537

软件开发,是进入互联网IT圈最好的选择之一!

起始薪资高、工作环境好、涨薪幅度高、行业更公平

软件开发之 Java 开发 ​

image-20220504101615999image-20220608160444947

1. 移动应用领域(集成 Android 平台):Java 在 Android 端是主要开发的语言,占有重要的地位。

image-2022051109264912220220608_160310

2. 企业级应用领域(JavaEE 后台):用来开发企业级的应用程序,大型网站如淘宝、京东、12306,以及各大物流、银行、金融、社交、医疗、交通、各种 OA 系统等都是用 JavaEE 技术开发的。

image-20220511090528043

3. 大数据分析、人工智能领域:流行的大数据框架,如 Hadoop、Flink 都是用 Java 编写的。Spark 使用 Scala 编写,但可以用 Java 开发应用。

image-20220511091647358image-20220513233529610

Eversoft 公司在提到 2022 年 Java 发展趋势时写道:

Java 是用于开发大数据项目的最主流的语言。我们可以轻松地预测它也将在之后继续主导大数据!

4. 游戏领域、桌面应用、嵌入式领域:很多大型游戏的后台、桌面应用等也是 Java 开发的。

到底多少人在用 Java ​

2020年,根据 IDC 的报告“Java Turns 25”显示,超过 900万 名开发人员(全球专职开发人员中的 69%)在使用 Java — 比其他任何语言都多。该报告指出,大多数企业业务服务都依靠 Java 来实现。

Java 一直是开发人员中最流行的编程语言,被誉为“宇宙第一语言”

我想告诉大家:

“市场的需求比较大,市场的供给比较大”。
“如果你在 Java 领域里持续积累5-7年以上,那么你至少会成为这个行业的一个专家!”

八卦一下程序员 ​

image-20220602105134523

还可以是:

image-20220602105213557

Java 系列课程体系 ​

Java 职业晋升路线图 ​

薪资数据统计来源:拉勾网

三. 计算机的硬件与软件 ​

计算机组成:硬件 + 软件 ​

CPU、内存、硬盘 ​

  • CPU(Central Processing Unit,中央处理器)

    人靠大脑思考,电脑靠 CPU 来运算、控制。

  • 硬盘(Hard Disk Drive)

    计算机最主要的存储设备,容量大,断电数据不丢失;
    正常分类:机械硬盘HDD、固态硬盘SSD 以及 混合硬盘SSHD;
    固态硬盘在开机速度和程序加载速度远远高于机械硬盘,缺点贵,所有无法完全取代机械硬盘。

  • 内存(Memory)

    负责硬盘上的数据与 CPU 之间数据交换处理,断电后数据丢失。
    保存从硬盘读取的数据,提供给 CPU 使用;
    保存 CPU 的一些临时执行结果,以便 CPU 下次使用或保存到硬盘;

输入设备:键盘输入 ​

熟悉指法

不熟悉键盘的小伙伴,可以“金山打字通”走起了。坚决杜绝二指禅!

四. 软件相关介绍 ​

什么是软件? ​

软件,即一系列按照特定顺序组织的计算机数据和指令的集合,分为系统软件和应用软件。

Pascal之父 Nicklaus Wirth: “Programs = Data Structures + Algorithms”

系统软件:

应用软件:

人机交互方式 ​

  • 图形化界面(Graphical User Interface,GUI):这种方式简单直观,使用者易于接受,容易上手操作。
  • 命令行方式(Command Line Interface,CLI):需要在控制台输入特定的指令,让计算机完成一些操作。需要记忆一些指令,较为麻烦。

DOS 命令(适用于 Windows) ​

DOS 是单用户、单任务(即只能执行一个任务)的操作系统。

DOS:全称为 Disk Operating System(磁盘操作系统),是 Microsoft 公司在 Windows 系统推出之前开发的早期操作系统。 虽然现在 DOS 已被 Windows 所取代,但 Windows 系统中仍然内置了兼容 DOS 风格的命令提示符(Command Prompt)工具,简称 cmd。

对于 Java 初学者来说,掌握一些基础的 DOS 命令,能帮助我们在不依赖图形界面的情况下完成文件管理、项目创建和程序运行等操作。

✅ 打开方式:键盘按下 Windows + R,输入 cmd 并回车,进入到 DOS 命令行窗口

Terminal 命令(适用于 MacOS) ​

macOS 是基于 UNIX 构建的现代操作系统,自带一个强大的命令行工具,叫做 Terminal(终端)。

Terminal:中文称为“终端”,是 macOS 中的命令行窗口,允许用户通过输入指令直接控制电脑、管理文件和运行程序。

对于 Java 初学者,同样有必要掌握一些常用 Terminal 命令,来操作文件系统和执行编译任务。

✅ 打开方式:使用快捷键 Command + 空格 打开 Spotlight,输入 terminal 并回车,即可打开终端窗口

🧠 Terminal 中的 bash 与 zsh 是什么?

在 macOS 中,Terminal(终端)只是一个“壳子”,真正负责解释我们输入命令、执行脚本的,其实是“Shell(壳)程序”。

而 bash 和 zsh,就是两种常见的 Shell 类型:

名称全称说明
bashBourne Again SHellLinux 与早期 macOS 默认 Shell,简单、稳定
zshZ Shell功能更强大,支持自动补全、语法高亮、更好的配置扩展

🕰️ 历史渊源与变化
早期版本的 macOS(10.15 Catalina 之前)默认使用的是 bash。
从 macOS 10.15 Catalina 起(2019 年),Apple 将默认的 Shell 改成了 zsh。

原因之一是 bash 的新版使用了 GPLv3 协议,而 Apple 不愿将其引入系统中。

不过你仍然可以随时切换使用 bash 或 zsh,它们都是兼容 POSIX 的 Shell,有很多命令是通用的。

🔄 如何查看/切换当前 Shell?

  • 查看当前使用的 Shell:
bash
echo $SHELL

输出如 /bin/zsh 表示你正在使用 zsh。

  • 临时切换(当前窗口有效):
bash
bash    # 切换到 bash
zsh     # 切换回 zsh
  • 永久更改默认 Shell:
bash
chsh -s /bin/zsh    # 设置默认使用 zsh
chsh -s /bin/bash   # 设置默认使用 bash

CMD 与 Terminal 命令对照表 ​

⚠️ 注意

关于文件系统对大小写的敏感性问题,不同操作系统默认行为如下:

操作系统默认是否区分大小写是否可改为区分大小写说明
Windows❌ 不区分⚠️技术支持但不推荐在 NTFS 文件系统中,虽然技术上支持大小写区分,但 Windows 默认行为是不区分的(即 file.txt 和 File.txt 视为同一个文件)。
macOS❌ 不区分✅ 可格式化为区分默认使用 APFS (不区分大小写) 或 HFS+ (大小写不敏感),但可格式化为区分大小写的版本,如 APFS (区分大小写)。大多数用户使用的是不区分大小写的版本,开发者可手动创建区分大小写的卷或磁盘镜像。
Linux✅ 区分✅ 可选常见文件系统(如 ext4、xfs 等)默认严格区分大小写,file.txt 与 File.txt 被认为是两个不同文件。

开发建议始终按照大小写敏感方式书写文件名和引用路径(即便在 macOS/Windows 测试通过)。

目录操作

操作Windows CMDmacOS Terminal说明
查看当前路径cdpwdCMD 中 cd 显示当前目录;macOS 用 pwd(print working directory)
查看目录内容dirls列出当前目录下的文件和文件夹
进入目录cd 目录名cd 目录名支持相对路径或绝对路径
进入多级目录cd dir1\dir2cd dir1/dir2
返回上一级cd ..cd ..返回上一层目录
返回根目录cd \cd /Windows 回到盘符根目录;mac 回到文件系统根目录
切换盘符<盘符名称>:(如D: 表示切换到D盘)⛔ 不适用(Mac 无盘符)Windows 可切换多盘符;macOS 默认只有一个文件系统结构

创建 / 删除目录与文件

操作Windows CMDmacOS Terminal说明
创建目录md 目录名 或 mkdirmkdir 目录名创建一个新目录
删除空目录rd 目录名rmdir 目录名
或 rm -d 目录名
仅能删除空目录
强制删除非空目录rd /s /q 目录名rm -rf 目录名危险操作,强制递归删除所有内容
创建空文件type nul > 文件名touch 文件名CMD 中 echo. > 文件名 创建的是带换行符的“伪空”文件,并不是字节长度为0的真正空文件
删除单个文件del 文件名rm 文件名删除指定文件
删除多个文件del *.txtrm *.txt使用通配符删除多个符合条件的文件

查看 / 编辑文件内容

⚠️ 注意

在终端执行编辑相关命令时,如果省略文件后缀,系统会创建一个新的无后缀同名文件,而不会修改已有的文件!为避免重复或误操作,请始终写出完整文件名(含后缀)。

写完整文件后缀,可被大多数系统/编辑器自动识别,更容易被其他人或工具识别用途。

操作Windows CMDmacOS Terminal说明
查看文件内容type 文件名cat 文件名适用于小文件;内容较多时推荐分页查看
分页查看文件more 文件名more 文件名
或 less 文件名
macOS 推荐使用 less,支持上下滚动
查看前几行内容—head -n 10 文件名查看文件前 10 行
查看后几行内容—tail -n 10 文件名查看文件后 10 行
编辑文件内容(终端内)copy con 文件名
或 notepad 文件名(推荐)
nano 文件名
或 vim 文件名
文件若不存在,则会创建。
copy con 是直接覆盖,无法基于文件已有内容继续编辑,每次需要重新输入。
nano 更适合新手;vim 功能强大但学习成本较高
编辑文件内容(图形)notepad 文件名
或 start 文件名
open 文件名

其他常用命

操作Windows CMDmacOS Terminal说明
清屏clsclear清空当前终端显示内容
退出终端exitexit关闭命令行窗口
历史命令↑ / ↓↑ / ↓ 或 history调阅历史命令
删除字符Backspace / DeleteBackspace / Delete删除输入中的字符
自动补全路径Tab(部分版本支持)Tab自动补齐文件夹/文件名
删除光标前整行(清空)EscCtrl + UCMD 无法一键删除光标前文本,只能手动或清空整行
删除光标前一个单词无Ctrl + WCMD 不支持「按单词」删除
清空整行Esc 多次Ctrl + U(Zsh 下)只能通过 Backspace 或重新输入来「模拟清空」
光标移动到行首HomeCtrl + ACMD 中使用 Home 键将光标移至行首
光标移动到行尾EndCtrl + ECMD 中使用 End 键将光标移至行尾

五. 计算机编程语言 ​

什么是计算机语言? ​

语言:是人与人之间用于沟通的一种方式。

例如:中国人与中国人用普通话沟通,而中国人要和英国人交流,可以使用英语或普通话。

计算机编程语言:就是人与计算机交流的方式。

人们可以使用 编程语言 对计算机下达 命令,让计算机按照命令完成人们需要的功能。

语言 = 语法 + 逻辑,计算机语言有很多种:

例如:C、C++、Java、Go、JavaScript、Python,Scala 等。

计算机语言简史 ​

第一代:机器语言(相当于人类的石器时代)

1946年2月14日,世界上第一台计算机 ENAC 诞生,使用的是最原始的 穿孔卡片,这种卡片上使用的是用 二进制代码 表示的语言,与人类语言差别极大,这种语言就称为机器语言。

比如一段典型的机器码:

md
1.	0000,0000,000000010000 代表 LOAD A, 16
2.	0000,0001,000000000001 代表 LOAD B, 1
3.	0001,0001,000000010000 代表 STORE B, 16

机器语言本质上是计算机能识别的唯一语言,人类很难理解。可以大胆想象"此时的程序员99.9%都是异类!"

image-20220309223406537

第二代:汇编语言(相当于人类的青铜&铁器时代)

使用 英文缩写的助记符 来表示基本的操作,这些助记符构成了汇编语言的基础。比如:LOAD、MOVE 等,使人更容易使用,因此汇编语言也称为 符号语言。

优点:能编写相对较高效率的程序。

缺点:汇编语言是面向机器的,不同计算机机型特点不同,因此会有不同的汇编语言,彼此之间 不能通用,程序不易移植,较难调试。

比起机器语言,汇编大大进步了,是机器语言向更高级的语言进化的桥梁,目前仍然应用于工业电子编程领域、软件的加密解密、计算机病毒分析等。

第三代:高级语言(相当于人类的信息时代)

高级语言发展于20世纪50年代中叶到70年代,是一种接近于人们使用习惯的程序设计语言, 它允许程序员使用 接近日常英语的指令 来编写程序,程序中的符号和算式也与日常用的数学式子差不多,接近于自然语言和数学语言,容易为人们掌握。比如:

高级语言独立于机器,有一定的通用性。

计算机不能直接识别和执行用高级语言编写的程序,需要使用编译器或解释器,转换为机器语言才能被识别和执行。

此外,高级语言按照程序设计方法的不同,又分为:面向过程的语言、面向对象的语言

  • C、Pascal、Fortran 面向过程的语言
  • C++ 面向过程/面向对象
  • Java 跨平台的纯面向对象的语言
  • C#、Python、JavaScript、Scala…

目前以及可预见的将来,计算机语言仍然处于“第三代高级语言”阶段。但是不管是什么语言,最后都要向机器语言靠近,因为 CPU 只认识 0 和 1。

计算机语言排行榜 ​

TIOBE是一个流行编程语言排行,每月更新。排名权重基于世界范围内工程师数量,Google、Bing、Yahoo! 、Wikipedia、Amazon、Youtube 和百度这些主流的搜索引擎,也将作为排名权重的参考指标。

计算机语言走势

编程语言,该学哪个? ​

网传的编程语言鄙视链:

image-20220310151750665

C:万物之源

诞生于1972年,由AT&T公司旗下贝尔实验室创建完成,用于构建 Unix 操作系统。

偏向计算机底层操作(操作系统、网络、硬件驱动等)。

优势:几乎所有现代编程语言都脱胎于 C。

劣势:相当陡的学习曲线;不支持面向对象编程。

C++:最复杂最难的语言

诞生于1983年,作为 C 语言的增强方案、升级版本。C++ 是 C 语言的超集,C 语言的大部分知识也适用于 C++。

用途:Windows 或 MacOS UI、office 全家桶、主流的浏览器、Oracle、MySQL、著名的游戏引擎(如星际争霸、魔兽世界)等。

优势:很多公司都用 C++ 开发核心架构,如 Google、腾讯、百度、阿里云等;面向对象性。

劣势:体系极为庞大,这是世界目前来说最复杂也是最难的编程语言。

C#:背靠大树(微软)的语言

诞生于2000年,一款强大而灵活的编程语言。靠着微软这棵大树,是多年来 Windows 平台的一门主流编程语言。

用途:Windows 桌面应用开发、Windows Azure、游戏开发。

PHP:最好的语言?

诞生于1994年,一款服务器端脚本语言。最初表示个人主页(Personal Home Page)。

PHP 语法和 C 类似,有很多的模板和框架,简单易懂,也许你可以在短短几天做出 web app。它主要用于 web 端,快速建站网络开发。

劣势:学习门槛太低、其代码运行速度相对较低于大部分编程语言竞争对手。

Python:易学的语言

诞生于1991年,一种面向对象的语言,虽然运行效率不高,但是开发效率非常高。

被称为胶水语言,哪里都可以用。

JavaScript:前端为王

诞生于1995年,网景公司开发完成。

是目前所有主流浏览器上唯一支持的脚本语言。在前端开发中,占有不可替代的地位。

Java:需求最多也最不缺人

创建于1995年,是一种面向对象、基于类的编程语言。

可能是目前运用最广的项目语言。代码稳定性超过 C 和 C++,生产力远超 C 和 C++。有 JVM 在,可以轻松地跨平台。

具有强大的开源开发工具,大量的开源共享库。

拥有世界上数量最多的程序员,最不缺人。

Go:夹缝中生存

现在很受关注,它是取代 C 和 C++ 的另一门有潜力的语言。

C 语言太原始了,C++ 太复杂了,Java 太高级了,所以 Go 语言就在这个夹缝中出现了。

已成为云计算领域事实上的标准语言,尤其是在 Docker/Kubernetes 等项目中。

语法特别简单,你有了 C 和 C++ 的基础,学习 Go 的学习成本基本为零。

Go 社区从 Java 社区移植了各种优秀的框架或库。

总结:

程序设计语言有很多种,每种语言都是为了实现某个特定的目的而发明的。

没有“最好”的语言,只有在特定场景下相对来说,最适合的语言而已。

如果你掌握了一种编程语言,也会更容易上手其它的编程语言。关键是学习如何使用程序设计方法来解决问题。

Talk is cheap,Show me the code。

六. Java 语言概述 ​

Java 概述 ​

Java 是 SUN(Stanford University Network,斯坦福大学网络公司 ) 1995年推出的一门高级编程语言。

是一种面向 Internet 的编程语言。Java 一开始富有吸引力是因为 Java 程序可以在 Web 浏览器中运行,这些 Java 程序被称为 Java 小程序(applet),内嵌在 HTML 代码中。

伴随着互联网的迅猛发展,以及 Java 技术在 Web 方面的不断成熟,已经成为 Web 应用程序的首选开发语言。

Java 语言简史 ​

起步阶段:

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

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

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

发展阶段:

发行版本发行时间备注
Java 1.01996.01.23Sun公司发布了Java的第一个开发工具包
Java 1.11997.02.19JavaOne会议召开,创当时全球同类会议规模之最。
Java 1.21998.12.08Java拆分成:J2SE(标准版)、J2EE(企业版)、J2ME(小型版)
Java 1.32000.05.08
Java1.42004.02.06
Java 5.02004.09.30① 版本号从1.4直接更新至5.0;② 平台更名为JavaSE、JavaEE、JavaME
Java 6.02006.12.112009.04.20 Oracle宣布收购SUN公司
2009.04.20Oracle公司收购SUN,交易价格74亿美元
Java 7.02011.07.02
Java 8.02014.03.18此版本是继Java 5.0以来变化最大的版本。是长期支持版本(LTS)
Java 9.02017.09.22① 此版本开始,每半年更新一次;② Java 9.0开始不再支持windows 32位系统
Java 10.02018.03.21
Java 11.02018.09.25JDK 安装包取消独立 JRE 安装包,是长期支持版本(LTS)
Java 12.02019.03.19
......
Java17.02021.09发布Java 17.0,版本号也称为21.9,是长期支持版本
......
Java19.02022.09发布Java19.0,版本号也称为22.9
.........

Java 之父 ​

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

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

公司八卦 ​

SUN 与 Oracle

SUN 是一家极具创新能力的公司,2001年 “9.11”以前,SUN公司市值超过1000亿美元。 但是没能利用Java构建一个强有力、可变现的生态系统,没打好Java这张牌。此后,互联网泡沫破裂,硬件需求大幅减少,它的市值在一个月之内跌幅超过90%。SUN公司的成长用了20年,而衰落只用了1年!

Google 和 Oracle 的侵权事件:

2010 年 8 月,Oracle 起诉 Google 的 Android 系统侵权,要求赔偿 26 亿美元,Oracle 认为 Google 的代码中使用了 Java 的 37 个API, 并且认为 Google 是故意为之,因为这样做的好处是可以让更多的 Java 程序员更容易接受 Android 的代码。

Oracle 认为 Android 中有 9 行代码直接抄袭了Java的实现。这 9 行牛气哄哄的代码都出自一人之手,他就是Java 大牛 —— Joshua Bloch。

java
//Code In OpenJDK / Android :
private static void rangeCheck(int arrayLen, int fromIndex, int toIndex) {
  if (fromIndex > toIndex)
    throw new IllegalArgumentException("fromIndex(" + fromIndex +") > toIndex(" + toIndex+")");
  if (fromIndex < 0)
    throw new ArrayIndexOutOfBoundsException(fromIndex);
  if (toIndex > arrayLen)
    throw new ArrayIndexOutOfBoundsException(toIndex);
}

2018 年 3 月,美国联邦巡回上诉法院裁决,谷歌侵犯了甲骨文的版权,支付高达88亿美元的赔偿金。

2021 年 4 月,美国最高法院给出了最终裁决:谷歌胜诉,其代码属于“合理使用”的范畴。为期十多年的软件行业“第一版权案”落幕。

Java 技术体系平台 ​

JavaSE(Java Standard Edition)标准版,以前称为 J2SE

支持面向桌面级应用开发(如 Windows 下的应用程序)的 Java 平台,即定位个人计算机的应用开发。

包括用户界面接口 AWT 及 Swing,网络功能与国际化、图像处理能力以及输入输出支持等。

JavaEE(Java Enterprise Edition)企业版,以前称为 J2EE

为开发企业环境下的应用程序提供的一套解决方案,即定位在服务器端的 Web 应用开发。

JavaEE 是 JavaSE 的扩展,增加了用于服务器开发的类库。如:Servlet 能够延伸服务器的功能,通过请求-响应的模式来处理客户端的请求;JSP 是一种可以将 Java 程序代码内嵌在网页内的技术。

JavaME(Java Micro Edition)小型版,以前称为 J2ME

支持 Java 程序运行在移动终端上的平台,即定位在消费性电子产品的应用开发(手机、机顶盒)。

JavaME 是 JavaSE 的内伸,精简了 JavaSE 的核心类库,同时也提供自己的扩展类。

增加了适合微小装置的类库:javax.microedition.io.* 等。

⚠️ 注意

Android 开发 !== JavaME 开发。

七. Java 开发环境搭建 ​

什么是 JDK、JRE ​

JDK(Java Development Kit):Java 程序开发工具包,包含 JRE、开发人员使用的工具。

JRE(Java Runtime Environment):Java 程序的运行时环境,包含 JVM、运行时所需要的核心类库。

如下是 Java 8.0 Platform:

小结:

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

JRE = JVM + Java SE 标准类库。

JDK 版本选择 ​

自 Java8 版本发布以来,其后的每次更新,都会有小伙伴高呼:Java8 YYDS!

论坛的声音:“你发任你发,我用 Java8!”

数据说话 - 1:

JRebel 于2022年4月前后发布了《2022 年Java生态系统状况报告》,报告中提到使用 Java11 的占比最多,Java8 紧随其后,如下图。而此前2020年的报告显示,Java8占比达到了84.48%。

我的分析:

G1 是最受欢迎的 GC 算法, Java11 及更高版本的 G1 收集器是默认的 GC,而 Java8 中并不是,出于对 G1 的喜爱,很多开发者才会选择抛弃 Java8。

数据说话 - 2:

此外,某美国软件开发商在对近千名专业的 Java 开发者调研后,发布的《2022年Java开发者生产力报告》称:八年前发布的 Java8 依然是 Java 中应用最广泛的版本,占比 37%,其次是 Java11,占比 29%。

高斯林说话:

Spring 框架说话:

在 Java17 正式发布之前,Java开发框架 Spring 率先在官博宣布,Spring Framework 6 和 Spring Boot 3 计划在 2022 年第四季度实现总体可用性的高端基线:

  • Java17+(来自 Spring Framework 5.3.x 线中的 Java 8-17)
  • Jakarta EE 9+(来自 Spring 框架 5.3.x 线中的 Java EE 7-8)

Spring官方说明:https://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-now-available

意味着:

Spring Boot 3.0 是需要用 java17 和 spring6.0 为基础建设。如果从企业选型最新 springboot3.0 作为架构来说,它搭配 JDK17 肯定是标配了。

JDK 下载 ​

所有版本下载:Java archive

进入之后就是选择安装对应的版本及操作系统,我们这里安装 JDK17:

macOS:区分 M 系列(ARM64)与 Intel(x64)芯片 ​

文件名支持架构适合芯片类型安装方式建议用途
✅ jdk-17.0.14_macos-aarch64_bin.dmgARM64Apple M1 / M2 / M3 等 M 系列芯片图形化安装(推荐)✅ Mac 新款(M 芯片)推荐
✅ jdk-17.0.14_macos-aarch64_bin.tar.gzARM64M 系列芯片手动解压安装适合高级用户或 Docker、脚本部署
✅ jdk-17.0.14_macos-x64_bin.dmgx64 (Intel)Intel 芯片(老款 Mac)图形化安装✅ Intel Mac 推荐
✅ jdk-17.0.14_macos-x64_bin.tar.gzx64 (Intel)Intel 芯片手动解压安装同上,适合命令行部署或自定义路径

Apple M 系列用户 一定要选 aarch64 开头的版本(即 ARM64 架构),否则会用到 Rosetta 转译,影响性能。

Windows:全是 x64,区别在于安装方式 ​

文件名类型安装方式说明建议用途
✅ jdk-17.0.14_windows-x64_bin.exe安装包(.exe)图形化安装(推荐)支持自动添加环境变量、注册表等普通 Windows 用户推荐
✅ jdk-17.0.14_windows-x64_bin.msiMSI 安装包可用于企业部署多用于批量部署、组策略控制有 IT 管理需求时选
✅ jdk-17.0.14_windows-x64_bin.zip压缩包手动解压配置需要自己配置 JAVA_HOME开发人员喜欢用,自由灵活

一般来说,普通 Windows 开发者直接下载 .exe 安装包即可,省心又自动。

小结:选择对照表 ​

操作系统芯片架构推荐版本文件安装方式
macOS (M 系列)ARM64 (aarch64)jdk-17.0.14_macos-aarch64_bin.dmg图形化
macOS (Intel)x64jdk-17.0.14_macos-x64_bin.dmg图形化
Windowsx64jdk-17.0.14_windows-x64_bin.exe图形化
Linuxx64 / ARM64根据架构选择 .tar.gz 或 .rpm通常解压部署

JDK 安装 ​

安装说明:

傻瓜式安装,下一步即可,建议:安装路径不要有中文或者空格等特殊符号。

我们这里演示 Windows 下同时安装 JDK8 和 JDK17,并以 JDK17 为默认版本进行讲解。

安装步骤:

双击 jdk-17_windows-x64_bin.exe 文件,并单击下一步

修改安装路径,单击更改

将安装路径修改为 D:\develop_tools\jdk\jdk-17.0.2\,并单击下一步

稍后几秒,安装完成

配置 path 环境变量 ​

理解 path 环境变量 ​

  • 什么是 path 环境变量?

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

  • 为什么配置 path?

    配置 PATH 是为了告诉操作系统在哪里可以找到可执行文件。当你在命令行中输入一个命令时,操作系统会按照 PATH 变量指定的路径顺序去搜索这个命令对应的可执行文件。 如果没有配置 PATH 或者路径设置不正确,你就需要在执行命令时输入完整的路径,这会变得很不方便。

    例如,在 Windows 系统上,如果你将 Python 安装在 C:\Python39 目录下,并且将该目录添加到 PATH 变量中,那么无论你在命令行中当前所处的目录是什么,只要你输入 python 命令, 系统就会找到 C:\Python39\python.exe 并执行它,而不需要输入完整的路径。

    因此,配置 PATH 可以提高命令行操作的便利性和效率。

  • 以 JDK 为例演示

    我们在 C:\Users\songhk 目录下使用 javac 命令,结果如下:

    我们在 JDK 的安装目录的 bin 目录下使用 javac 命令,结果如下:

我们不可能每次使用 java.exe、javac.exe 等工具时,都进入到 JDK 的安装目录下,太麻烦了, 这时就需要配置 path 环境变量,希望在命令行使用 javac.exe 等工具时,任意目录下都可以找到这个工具所在的目录。

JDK8 配置方案一:只配置 PATH ​

  • 步骤:

    打开桌面上的计算机,进入后在左侧找到此电脑,单击鼠标右键,选择属性:

    选择高级系统设置:

    在高级选项卡,单击环境变量:

    在系统变量中,选中 Path 环境变量,双击或点击编辑:

    点击新建,填入 JDK 安装目录下 bin 文件目录如 D:\xxx\jdk\jdk1.8.0_271\bin ,并将此值 上移 到变量列表的首位:

    编辑模式一:

    编辑模式二:(注意,结尾需要有英文模式下的分号;)

  • 环境变量配置完成,重新打开 DOS 命令行,在任意目录下输入 javac 或 java 或 java -version,运行成功:

JDK8 配置方案二(推荐):配置 JAVA_HOME + PATH ​

  • 步骤:

    打开桌面上的计算机,进入后在左侧找到 计算机,单击鼠标右键,选择属性:

    选择高级系统设置:

    在高级选项卡,单击环境变量:

    在系统变量中,单击新建 ,创建新的环境变量:

    变量名输入 JAVA_HOME,变量值输入 JDK 安装目录如 D:\xxx\jdk\jdk1.8.0_271,单击确定:

    选中 Path 环境变量,双击或点击编辑 :

    在变量值的最前面,键入 %JAVA_HOME%\bin:

⚠️ 注意

强烈建议将 %JAVA_HOME%\bin 声明在 path 环境变量中所有变量的最前面!

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

⚠️ 注意

有的书籍、论坛、视频上还提到配置 classpath,用于指名 class 文件识别的路径,

其实是没必要的,反而建议大家如果配置了 classpath 环境变量,要删除,对于初学者,反而不友好。

JDK17 配置方案:自动配置 ​

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

竟然成功了!而且是17.0.2版本。因为 JDK17 在安装之后,自动进行了环境变量的配置。如下:

这里建议,将 JDK17 安装的路径,设置为 JAVA_HOME,并将 %JAVA_HOME%\bin 上移到首位

思考:如果你仍然希望在 JDK8 下开发 Java 程序?如何做呢?

Windows 切换 JDK 版本 ​

方法一:修改系统环境变量

编辑 PATH,把你想使用的 JDK 的 bin 路径移到最前。

设置/修改 JAVA_HOME 指向目标版本的 JDK 根目录。

可选:在 PATH 中添加 %JAVA_HOME%\bin(这样只需要切换 JAVA_HOME 即可切换版本)。

方法二:写多个 .bat 脚本快速切换(适合开发)

bat
:: use-jdk8.bat
@echo off
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_341
set PATH=%JAVA_HOME%\bin;%PATH%
bat
:: use-jdk17.bat
@echo off
set JAVA_HOME=C:\Program Files\Java\jdk-17
set PATH=%JAVA_HOME%\bin;%PATH%

双击或在终端运行某个脚本,即可在当前 cmd 会话中切换 JDK 版本(注意:只影响当前窗口)。

方法三:第三方图形工具(可选)

JDKSwitcher、Java Version Switcher 或通过 IntelliJ IDEA 的 Project SDK 设置临时选择项目使用的 JDK。

MacOS 切换 JDK 版本 ​

方法一:临时切换(当前终端有效)

bash
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
# 或者切换到 JDK17:
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
bash
# 查看:
echo $JAVA_HOME

方法二:永久切换

bash
# 编辑 ~/.zshrc 或 ~/.bash_profile,添加:
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
export PATH=$JAVA_HOME/bin:$PATH

保存后运行:

bash
source ~/.zshrc

方法三:工具辅助(可选)

jEnv:像 nvm 一样管理 Java 版本,支持全局和项目级 Java 版本切换。

或通过 IntelliJ IDEA 的 Project SDK 设置临时选择项目使用的 JDK。

八. 开发体验:HelloWorld ​

安装好 JDK 后,我们可以开始编写第一个 Java 程序了,习惯上称为「HelloWorld」。

Java 程序开发的三大步骤 ​

① 编写:将 Java 代码写入以 .java 为后缀的源文件中。

② 编译:使用 javac 命令将 .java 文件编译成 .class 字节码文件(一个或多个)。

③ 运行:使用 java 命令运行 .class 字节码文件。

第一步:编写 Java 源代码 ​

  • ① 创建源文件

    在 D:\JavaSE\chapter01 目录下新建一个名为 HelloWorld 的文件,后缀格式必须为.java。

  • ② 使用编辑器编写代码

    建议使用带语法高亮的编辑器(如 VSCode、EditPlus、Notepad++ 等),避免使用记事本。

    输入如下代码并保存:

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

⚠️ 注意

  • 本示例刻意使用 HelloWorld.java 存放 class HelloChina,是为了说明:

    后面进行编译操作时,所生成的 .class 字节码文件名,并不是由源文件名决定的,而是由类名决定的。

Java 文件命名规则说明:

类是否为 public源文件名是否必须与类名一致说明
✅ 是✅ 是必须一致,且区分大小写,否则编译失败
❌ 否❌ 否(可不一致)但强烈建议一致,有助于维护与识别
提示
  • 每个字符、大小写和标点都必须与示例完全一致。
  • 如果你在 Windows 中看不到文件后缀,建议先取消隐藏已知文件类型扩展名:
  • 或

第一个 HelloWord 源程序就编写完成了,但是这个文件是程序员编写的,JVM 是看不懂的,也就不能运行, 因此我们必须将编写好的 .java 源文件编译成 JVM 可以看懂的字节码文件(即 .class 文件)。

第二步:编译 Java 源文件 ​

  • ① 打开命令行终端

    使用资源管理器打开 D:\JavaSE\chapter01 目录,在地址栏输入 cmd 并回车,打开命令行窗口:

  • ② 编译源代码

    在 cmd 中,使用 javac 命令对 .java 源文件进行编译,运行命令格式:

    shell
    javac 源文件名.java

    在 cmd 中输入:

    shell
    javac HelloWorld.java

    如下所示:

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

🔔 提示

为什么生成的字节码文件名是 HelloChina.java ? 而不是 HellWorld.java?

这是因为前面说过,所生成的 .class 字节码文件名,并不是由源文件名决定的,而是由类名决定的

第三步:运行字节码文件 ​

  • 使用 java 命令执行字节码文件,运行命令格式:

    bash
    java 主类名 # 如 HelloChina

    示例(不要加 .class 后缀):

    bash
    java HelloChina        # ✅ 正确
    java HelloChina.class  # ❌ 错误

    ⚠️ 注意

    Java 的 java 命令运行的是类名,不是文件名或 .class 后缀格式的文件名。

  • 运行入口说明:

    Java 程序的主类是指包含 main 方法的类,main 方法是程序的入口方法:

    java
    class HelloChina {
        public static void main(String[] args) {
            // 程序入口
        }
    }
  • 效果如下:

新特性:直接运行源文件 ​

引言

从 Java 11 开始,为了简化小型脚本或测试代码的执行过程,java 命令支持直接编译并运行 .java 源文件,无需使用 javac 手动编译。

步骤如下:

  • ① 确认 JDK 版本为 11 或以上

    你需要确保你的 JDK 版本是 11 或更高版本。你可以通过运行以下命令来检查 Java 版本:

    shell
    java -version
  • ② 编写源文件(HelloWorld.java):

    创建一个 Java 源文件,例如 HelloWorld.java,内容如下:

    java
    public class HelloWorld {
        public static void main(String[] args) {
            System.out.println("Hello, World!");
        }
    }
  • ③ 直接运行(无需先编译):

    使用 java 命令直接运行源文件,而不需要先使用 javac 进行编译:

    bash
    java HelloWorld.java

原理说明:

  • 该功能由 Java 运行时自动完成:

    临时编译源文件 → 执行生成的字节码 → 自动清理中间产物

  • 适用于:快速测试、小型脚本等开发场景。
详细信息

这个特性是在 Java 11 中引入的,主要为了提高开发效率,尤其是对于一些简单的脚本或一次性的小程序。其背后的机制是 Java 运行时会临时编译这个源文件,然后立即运行生成的字节码。这个过程对用户是透明的,因此你感觉就像直接运行源文件一样。

该特性可以大大简化开发者在编写和测试小型程序时的操作步骤。通过这种方式,你无需显式地进行编译,可以直接在命令行中运行 Java 源文件。

小结 ​

步骤传统方式(适用于所有版本)Java 11+ 新方式(仅限简单类)
编译javac HelloWorld.java无需手动编译
运行java HelloWorldjava HelloWorld.java

九. Java 开发工具 ​

常见开发工具分类 ​

Java 开发常用的工具主要可以分为两大类:

  • 级别一:文本开发工具(轻量)

    适合初学者入门,操作直观,便于打基础。

    常见工具包括:记事本(Notepad)、Notepad++、VS Code、Sublime Text 等。

  • 级别二:集成开发环境(Integrated Development Environment,IDE)

    将代码编写、编译、执行、调试、项目管理等功能整合在一个工具中。

    功能强大,适合中后期开发与企业级项目。

    常见 Java IDE:IntelliJ IDEA(推荐)、Eclipse、NetBeans 等。

如何选择 ​

学习阶段推荐工具理由
前期文本编辑器(如 Notepad++)培养基本代码感,强化基础语法理解;利于应对手写题(如笔试或面试)
后期集成开发环境(IDE)自动补全、调试工具、项目管理更高效,适合中大型项目开发

十. 常见问题:编译运行路径、字符编码 ​

拼写与格式问题 ​

  • 大小写敏感

    Java 是一门严格区分大小写的语言。

    ✅ 正确示例:

    java
    class、String、System、main

    ❌ 错误示例:

    java
    Class、string、system、mian
  • 标点与符号问题

    必须使用英文半角符号(不能用中文全角标点)。

    括号(圆括号 {} () 等)必须成对出现。

编译、运行路径问题 ​

  • 🚫 示例 1:找不到源文件

    bash
    > javac Test1.java
    error: file not found: Test1.java
    Usage: javac <options> <source files>
    use --help for a list of possible options

    可能原因:

    • 文件名不存在或拼写错误
    • 当前路径错误(未 cd 到源码目录)
    • 后缀名被系统隐藏,实际可能是 Test1.java.txt
  • 🚫 示例 2:找不到或加载类失败

    bash
    > java Test1
    Error: Could not find or load main class Test1
    Caused by: java.lang.ClassNotFoundException: Test1

    可能原因:

    • .class 文件名拼错,或与主类名不一致(区分大小写)
    • Test1.class 不在当前目录
    • 当前命令执行路径与编译路径不一致,或 classpath 设置错误

语法问题 ​

  • 🚫 示例 1:类名与文件名不一致

    java
    public class HelloWorld {
      public static void main(String[] args) {
      	System.out.println("hello world, 你好");
      }
    }
    bash
    > javac Helloworld.java 
    Helloworld.java:1: error: class HelloWorld is public, should be declared in a file named HelloWorld.java
    public class HelloWorld {
           ^
    1 error

    ⚠️ 注意

    声明为 public 的类名必须与文件名完全一致(区分大小写),否则编译失败

  • 🚫 示例 2:漏掉分号

    java
    public class HelloWorld {
      public static void main(String[] args) {
          System.out.println("hello world, 你好") // 漏了分号
      }
    }
    bash
    > javac Helloworld.java
    Helloworld.java:3: error: ';' expected
                    System.out.println("hello world, 你好")
                                                          ^
    1 error

    编译失败,注意错误出现的行数,再到源代码中指定位置改错

字符编码问题(中文乱码) ​

引言

在现代的 macOS 和大多数 Linux 发行版中,终端默认就是 UTF-8 编码环境,通常不需要像 Windows 一样显式设置字符编码为 UTF-8。

  1. 默认终端编码就是 UTF-8

在现代的 macOS 和大多数 Linux 发行版中,终端默认就是 UTF-8 编码环境:

  • macOS Terminal 默认使用 UTF-8(可在“终端 → 偏好设置”中查看)
  • Ubuntu、Debian、Fedora 等默认也是 LANG=en_US.UTF-8 或类似值

可以通过以下命令验证当前系统编码: bash

  • 问题描述:

    当命令行窗口的字符编码与 .java 源文件的字符编码不一致,如何解决?

  • ✅ 解决方案一:修改文件编码:

    使用 Notepad++、EditPlus 等编辑器将源文件字符编码设置为 ANSI(GBK) 或 UTF-8。

    在 EditPlus 中可以将 Java 源文件另存为 ANSI 编码方式(中文操作系统下即为 GBK 字符集)。

  • ✅ 解决方案二:指定编译编码

    在使用 javac 命令时,可以指定源文件的字符编码

    bash
    javac -encoding utf-8 DemoTest.java
  • ✅ 解决方案三(推荐):全局配置默认编码(UTF-8)

    通过设置系统环境变量 JAVA_TOOL_OPTIONS

    • 设置步骤(Windows):
      1. 右键【此电脑】 → 属性 → 高级系统设置 → 环境变量
      2. 在 系统变量 中点击【新建】
      3. 变量名:JAVA_TOOL_OPTIONS
      4. 变量值:-Dfile.encoding=UTF-8
      5. 保存并关闭,重新打开命令行窗口使设置生效

    总结:

    • 在 win10 系统中,由于我们设置的区域是中国大陆,所以系统默认的编码格式是简体中文的 GBK 编码,在 Windows 中常用于处理中文字符。所以导致在使用 javac 编译文件时出现中文乱码的原因

    • 在 Windows 系统上,你可以通过命令行查看系统的默认编码格式

      shell
      chcp # 显示当前的命令行编码
      • 常见的 UTF-8 编码对应的代码页是 65001。如果你看到代码页是 65001,那么当前的命令行编码就是 UTF-8
      • 936 对应的是 简体中文的 GBK 编码
    • 最终解决

      • 前面两种方式都不提倡,不可能每次保存时还去修改编码格式,也不可能将编辑器的保存格式修改,这样会导致别的文件编码格式有问题
      • 在全局配置中设置 javac 编译器的字符编码为 UTF-8,使用 JAVA_TOOL_OPTIONS 环境变量
      • 在 Windows 上,按照以下步骤进行设置:
        • 打开系统环境变量设置:
          • 右键点击此电脑/我的电脑 -> 属性 -> 高级系统设置 -> 环境变量
        • 创建 JAVA_TOOL_OPTIONS 环境变量:
          • 在“系统变量”部分点击“新建”
          • 变量名输入 JAVA_TOOL_OPTIONS
          • 变量值设置为 -Dfile.encoding=UTF-8
        • 点击“确定”保存设置
        • 重启命令提示符或其他编译器: 为了让变更生效,关闭并重新打开命令提示符或其他编译器
      • 这样设置后,javac 编译器应该默认使用 UTF-8 字符编码进行编译。任何通过 javac 编译的文件都会使用 UTF-8 编码进行处
    • 测试结果:

      bash
      > javac DemoTest.java
      Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
      • Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 意思是:
    • 这个信息是 Java 运行时环境(JRE)或者开发工具(JDK)在启动时检测到了一个名为 JAVA_TOOL_OPTIONS 的环境变量,并且发现它设置了一个属性 -Dfile.encoding=UTF-8

      • -Dfile.encoding=UTF-8 表示设置了一个系统属性,告诉 Java 使用 UTF-8 编码来处理文件
    • 当你设置 JAVA_TOOL_OPTIONS 环境变量并赋予它 -Dfile.encoding=UTF-8 这个值后,Java 运行时会读取这个环境变量并在启动时应用这个属性。这意味着任何使用 Java 编程语言进行的文件读写、字符编码等操作都会使用 UTF-8 这种编码方式

05. 建议 ​

  • 注意缩进!

    • 一定要有缩进。缩进就像人得体的衣着一样!

    • 只要遇到 {} 就缩进,缩进的快捷键 tab 键

  • 必要的空格

    • 变量类型、变量、赋值符号、变量值之间填充相应空格,更美观。比如: int num = 10

十一. HelloWorld 小结 ​


01. Java 程序的结构与格式 ​

  • 结构:

    java
    类{
      方法{
        语句;
      }
    }
  • 格式:

    • 每一级缩进一个 Tab 键
    • {} 的左半部分在行尾,右半部分单独一行,与和它成对的"{"的行首对齐

02. Java 程序的入口 ​

  • Java 程序的入口是 main 方法:

    java
    public static void main(String[] args){}

03. 两种常见的输出语句 ​

  • 换行输出语句:输出内容,完毕后进行换行,格式如下:

    java
    System.out.println("输出内容");
  • 直接输出语句:输出内容,完毕后不做任何处理,格式如下

    java
    System.out.print("输出内容");

注意:

  • 换行输出语句,括号内可以什么都不写,只做换行处理

  • 直接输出语句,print()括号内什么都不写的话,编译报错

04. 源文件名与类名 ​

  • 源文件名是否必须与类名一致?public 呢?

    • 如果这个类不是 public,那么源文件名可以和类名不一致。但是不便于代码维护

    • 如果某个类用 public 修饰,那么源文件名必须与该类名一致。否则编译报错

    • 我们建议大家,不管是否是 public,都与源文件名保持一致,而且一个源文件尽量只写一个类,目的是为了好维护

  • 一个源文件中是否可以有多个类?public 呢?

    • 一个源文件中可以有多个类,编译后会生成多个 .class 字节码文件

      image-20231118010949478
    • 但是一个源文件只能有一个 public 的类

      image-20231118010838494

总结:

  • 一个 java 源文件中可以有多个类,但是最多只能声明一个 public 类

  • public 类的类名与源文件名必须一致

十二. 注释(comment) ​


image-20220610113151774
  • 什么是注释?

    • 源文件中用于解释、说明程序的文字就是注释
  • 注释是一个程序员必须要具有的良好编程习惯。实际开发中,程序员可以先将自己的思想通过注释整理出来,再用代码去体现

    程序员最讨厌两件事:

    • 一件是自己写代码被要求加注释

    • 另一件是接手别人代码,发现没有注释

  • 不加注释的危害

  • Java 中的注释类型:

    • 单行注释

      java
      //	注释文字
    • 多行注释

      java
      /* 
      	注释文字1
      	注释文字2
      	注释文字3
      */
    • 文档注释 (Java特有)

      java
      /**
      	@author	指定java程序的作者
      	@version	指定源文件的版本
      */
  • 注释的作用

    • 它提升了程序的可阅读性(不加注释的危害性,见图)
    • 调试程序的重要方法
  • 具体使用1:单行注释、多行注释

    • 对于单行和多行注释,被注释的文字,不会出现在字节码文件中,也就不会被 JVM(java 虚拟机)解释执行

    • 多行注释里面不允许有多行注释嵌套

    • 一个段子

      java
      A:嘿 //是什么意思啊?
      B:嘿.
      A:呃 我问你//是什么意思?
      B:问吧.
      A:我刚才不是问了么?
      B:啊?
      A:你再看看记录...
      B:看完了.
      A:......所以//是啥?
      B:所以什么?
      A:你存心耍我呢吧?
      B:没有啊 你想问什么?
      ……
      不断循环之后,A一气之下和B绝交,自己苦学程序。
      N年之后,A终于修成正果,回想起B,又把聊天记录翻出来看,这时,他突然发现B没有耍他……
      而他自己也不知道当年他问B的究竟是什么问题……
  • 具体使用2:文档注释(Java特有)

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

    • 操作方式,如:

      shell
      javadoc -d mydoc -author -version HelloWorld.java

      image-20240507004335523

  • 案例:

    java
    //单行注释
    /*
    多行注释
    */
    /**
    文档注释演示。这是我的第一个Java程序!^_^
    @author songhk
    @version 1.0
    */
    public class HelloWorld{
    
      /**
    	Java程序的入口
    	@param args main方法的命令参数
    	*/
      public static void main(String[] args){
        System.out.println("hello");
      }
    }

十三. Java API 文档 ​

十四. Java 运行环境:JVM(java虚拟机) ​


01. Java 语言的优缺点 ​

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

优点 ​

**跨平台性:**这是 Java 的核心优势。Java 在最初设计时就很注重移植和跨平台性。比如:Java 的 int 永远都是 32 位。不像 C++ 可能是16,32,可能是根据编译器厂商规定的变化。

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

image-20211217111217831

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

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

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

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

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

缺点 ​

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

02. JVM 功能说明 ​

  • JVM(Java Virtual Machine ,Java虚拟机):是一个虚拟的计算机,是 Java 程序的运行环境

  • JVM 具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器

    image-20220310165805739

功能一:实现 Java 程序的跨平台性 ​

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

    image-20220513191856727
  • 使用 JVM 前后对比:

    image-20220514151716805

功能二:自动内存管理(内存分配、内存回收) ​

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

十五. 章节案例 ​


  • 案例1:个人信息输出

    image-20231206230740815
    java
    class Exercise1{
    	public static void main(String[] args){
    		System.out.println("姓名:康师傅");
    		System.out.println("性别:男");
    		System.out.println("家庭住址:北京程序员聚集地:回龙观");
    	}
    }
  • 案例2:输出:心形

    • 结合 \n(换行newline),\t(制表符tab),空格等在控制台打印出如下图所示的效果

      image-20231206231308725
  • 方式一:

    java
    public class StarPrintTest {
      public static void main(String[] args) {
        System.out.print("\t");
    		System.out.print("*");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		
    		System.out.println("*");
    
    		
    		System.out.print("*");
    		System.out.print("\t");
    		//System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("I love java");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.println("*");
    
    		
    		System.out.print("\t");
    		System.out.print("*");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		
    		System.out.println("*");
    
    		
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("*");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		
    		System.out.println("*");
    
    		
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("*");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		
    		System.out.println("*");
    		
    		
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("*");
    		System.out.print("\t");
    		
    		System.out.println("*");
    
    		
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("\t");
    		System.out.print("    ");
    		System.out.print("*");
      }
    }
  • 方式二:

    java
    public class StarPrintTest {
      public static void main(String[] args) {
        System.out.print("\t"+"*"+"\t\t\t\t\t\t\t\t\t\t\t\t"+"*"+"\t"+"\n");
    		System.out.print("*"+"\t\t"+"*"+"\t\t\t\t"+"I love Java"+"\t\t\t\t"+"*"+"\t\t\t"+"*"+"\n");
    		System.out.print("\t"+"*"+"\t\t\t\t\t\t\t\t\t\t\t\t"+"*"+"\t"+"\n");
    		System.out.print("\t\t"+"*"+"\t\t\t\t\t\t\t\t\t\t"+"*"+"\t\t"+"\n");
    		System.out.print("\t\t\t"+"*"+"\t\t\t\t\t\t\t\t"+"*"+"\t"+"\n");
    		System.out.print("\t\t\t\t"+"*"+"\t\t\t\t\t\t"+"*"+""+"\t"+"\n");
    		System.out.print("\t\t\t\t\t"+"*"+"\t\t\t\t"+"*"+""+"\t\t"+"\n");
    		System.out.print("\t\t\t\t\t\t"+"*"+"\t\t"+"*"+""+"\t\t"+"\n");
    		System.out.print("\t\t\t\t\t\t\t"+"*"+"\n");
      }
    }

十六. 如何看待Java是一门半编译半解释型的语音 ​

image-20240601220914436

字节码编译到机器码的过程:部分代码走解释器解释执行,部分热点代码走JIT编译器编译执行。

如有转载或CV请标注本站原文地址