Java 的应用领域
学 Java 干什么?
- 后端开发
- 大数据相关
企业级应用领域(JavaEE 后端)
国内后端开发,Java 占碾压式优势
其他后端开发语言:Go、C/C++、Node.js、PHP、Python 等
大数据分析、人工智能领域
流行的大数据框架,如 Hadoop、Flink 都是用 Java 编写的。Spark 使用 Scala 编写,但可以用 Java 开发应用。
Eversoft 公司在提到 2022 年 Java 发展趋势时写道:
Java 是用于开发大数据项目的最主流的语言。我们可以轻松地预测它也将在之后继续主导大数据!
移动应用领域(Android)
Java 在 Android 端是主要开发的语言,占有重要的地位
由于 Oracle 经常和 Google 就 Android 使用 Java 代码相关问题打官司,Android 开发已经从 Java 转向 Kotlin,Kotlin 成为 Android 开发第一语言,Java 逐渐被取代
游戏领域 、桌面应用、嵌入式领域
很多大型游戏的后台、桌面应用等也是 Java 开发的
软件开发及人机交互方式
计算机组成:硬件 + 软件
软件,即一系列按照特定顺序组织的计算机数据和指令的集合。有系统软件和应用软件之分。
人机交互方式
- 图形化界面(Graphical User Interface,GUI),这种方式简单直观,使用者易于接受,容易上手操作
- 命令行方式(Command Line Interface,CLI),需要在控制台输入特定的指令,让计算机完成一些操作。需要记忆一些指令,较为麻烦。
计算机编程语言概述
- 第一代:机器语言(相当于人类的石器时代)
- 第二代:汇编语言(相当于人类的青铜&铁器时代)
- 第三代:高级语言(相当于人类的信息时代)
高级语言独立于机器,有一定的通用性;计算机不能直接识别和执行用高级语言编写的程序,需要使用编译器或者解释器,转换为机器语言才能被识别和执行。
此外,高级语言按照程序设计方法的不同,又分为:面向过程的语言、面向对象的语言。
- C、Pascal、Fortran 面向过程的语言
- C++ 面向过程/面向对象
- Java 跨平台的纯面向对象的语言
- C#、Python、JavaScript、Scala…
目前以及可预见的将来,计算机语言仍然处于“第三代高级语言”阶段。但是不管是什么语言,最后都要向机器语言靠近,因为 CPU 只认识 0 和 1。
计算机语言排行榜
TIOBE(https://www.tiobe.com/tiobe-index/)是一个流行编程语言排行,每月更新。排名权重基于世界范围内工程师数量,Google、Bing、Yahoo! 、Wikipedia、Amazon、Youtube 和百度这些主流的搜索引擎,也将作为排名权重的参考指标。
计算机语言走势:
编程语言,该学哪个?
- 程序设计语言有很多种,每种语言都是为了实现某个特定的目的而发明的。
- 没有“最好”的语言,只有在特定场景下相对来说,最适合的语言而已。
- 如果你掌握了一种编程语言,也会更容易上手其它的编程语言。关键是学习如何使用程序设计方法来解决问题。这也是本套课程的主旨。
- Talk is cheap,Show me the code。
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.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,交易价格 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 | |
… | … | |
Java 17.0 | 2021.09 | 发布 Java 17.0,版本号也称为 21.9,是长期支持版本 |
… | … | |
Java 19.0 | 2022.09 | 发布 Java 19.0,版本号也称为 22.9 |
Java 之父
詹姆斯·高斯林(James Gosling)先生以“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 年!
Oracle 与 Google
Google 和 Oracle 的侵权事件:
2010 年 8 月,Oracle 起诉 Google 的 Android 系统侵权,要求赔偿 26 亿美元。
- Oracle 认为 Google 的代码中使用了 Java 的 37 个 API,并且认为 Google 是故意为之,因为这样做的好处是可以让更多的 Java 程序员更容易接受 Android 的代码。
- Oracle 认为 Android 中有 9 行代码直接抄袭了 Java 的实现。这 9 行牛气哄哄的代码都出自一人之手,他就是 Java 大牛——Joshua Bloch
2018 年 3 月,美国联邦巡回上诉法院裁决,谷歌侵犯了甲骨文的版权,支付高达 88 亿美元的赔偿金。
2021 年 4 月,美国最高法院给出了最终裁决:谷歌胜诉,其代码属于“合理使用”的范畴。为期十多年的软件行业“第一版权案”落幕。
// Code In OpenJDK / Android:
1. private static void rangeCheck(int arrayLen, int fromIndex, int toIndex) {
2. if (fromIndex > toIndex)
3. throw new IllegalArgumentException("fromIndex(" + fromIndex +
4. ") > toIndex(" + toIndex+")");
5. if (fromIndex < 0)
6. throw new ArrayIndexOutOfBoundsException(fromIndex);
7. if (toIndex > arrayLen)
8. throw new ArrayIndexOutOfBoundsException(toIndex);
9. }
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 程序运行在移动终端(手机、机顶盒)上的平台,即定位在消费性电子产品的应用开发
- JavaME 是 JavaSE 的内伸,精简了 JavaSE 的核心类库,同时也提供自己的扩展类。增加了适合微小装置的类库:
javax.microedition.io.*
等。 - 此版本以前称为 J2ME
注意:Android 开发不是 Java ME 的开发
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 版本选择
- 自 Java 8 版本发布以来,其后的每次更新,都会有小伙伴高呼:Java8 YYDS!
- 论坛的声音:“你发任你发,我用 Java 8!”
数据说话 1:
JRebel 于 2022 年 4 月前后发布了《2022 年 Java 生态系统状况报告》,报告中提到使用 Java11 的占比最多,Java 8 紧随其后,如下图。而此前 2020 年的报告显示,Java8 占比达到了 84.48%。
宋红康老师:G1 是最受欢迎的 GC 算法。Java 11 及更高版本 G1 收集器是默认的 GC,而 Java 8 中并不是。出于对 G1 的喜爱,很多开发者才会选择抛弃 Java 8。
数据说话 2:
此外,某美国软件开发商在对近千名专业的 Java 开发者调研后,发布的《2022 年 Java 开发者生产力报告》称:八年前发布的 Java 8 依然是 Java 中应用最广泛的版本,占比 37%,其次是 Java 11,占比 29%
高斯林说话:
Spring 框架说话:
在 Java 17 正式发布之前,Java 开发框架 Spring 率先在官博宣布,Spring Framework 6 和 Spring Boot 3 计划在 2022 年第四季度实现总体可用性的高端基线:
- Java 17+(来自 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 和 spring 6.0 为基础建设。如果从企业选型最新 spring boot 3.0 作为架构来说,它搭配 jdk17 肯定是标配了。
JDK 的下载、安装
下载网址(Oracle 公司官网):www.oracle.com
安装说明:
- 傻瓜式安装,下一步即可。
- 建议:安装路径不要有中文或者空格等特殊符号。
- 本套课程会同时安装 JDK8 和 JDK17,并以 JDK17 为默认版本进行讲解。
配置环境变量
理解 path
环境变量
问:什么是 path
环境变量?
答:window 操作系统执行命令时,所要搜寻的路径。
问:为什么配置 path
?
答:希望在命令行使用 javac.exe
等工具时,任意目录下都可以找到这个工具所在的目录。
我们不可能每次使用 java.exe
、javac.exe
等工具的时候都进入到 JDK 的安装目录下,太麻烦了。这时就需要配置 path
环境变量。
配置 JAVA_HOME
和 path
环境变量
JAVA_HOME
:JDK 安装目录,如:D:\develop_tools\jdk\jdk1.8.0_271
Path
:添加%JAVA_HOME%\bin
环境变量配置完成,重启 DOS 命令行,在任意目录下输入 javac
或 java
或 java -version
,运行成功
宋红康老师:有的书籍、论坛、视频上还提到配置
classpath
,用于指名class
文件识别的路径。其实是没必要的,反而建议大家如果配置了classpath
环境变量,要删除。对于初学者,反而不友好。
小结:
JDK17 自动配置
JDK17 在安装之后,自动进行了环境变量的配置。如下:
这里建议,将 JDK17 安装的路径,设置为 JAVA_HOME
,并将 %JAVA_HOME%\bin
上移到首位。
思考:如果你仍然希望在 JDK8 下开发 Java 程序?如何做呢?
Hello World
JDK 安装完毕,我们就可以开发第一个 Java 程序了,习惯性的称为:HelloWorld。
开发步骤
Java 程序开发三步骤:编写、编译、运行。
- 将 Java 代码编写到扩展名为
.java
的源文件中 - 通过
javac.exe
命令对该java
文件进行编译,生成一个或多个字节码文件 - 通过
java.exe
命令对生成的class
文件进行运行
编写
- 在
D:\JavaSE\chapter01
目录下新建文本文件,完整的文件名修改为HelloWorld.java
,其中文件名为HelloWorld
,后缀名必须为.java
。 - 用记事本或 editplus 等文本编辑器打开(虽然记事本也可以,但是没有关键字颜色标识,不利于初学者学习)
- 在文件中输入如下代码,并且保存:
class HelloChina {
public static void main(String[] args) {
System.out.println("HelloWorld!!");
}
}
- 友情提示 1:每个字母和符号必须与示例代码一模一样,包括大小写在内。
- 友情提示 2:注意“隐藏文件后缀名”
第一个 HelloWord
源程序就编写完成了,但是这个文件是程序员编写的,JVM 是看不懂的,也就不能运行,因此我们必须将编写好的 Java 源文件编译成 JVM 可以看懂的字节码文件,也就是 .class
文件。
编译
在 DOS 命令行中,进入 D:\JavaSE\chapter01
目录,使用 javac
命令进行编译。
使用文件资源管理器打开 D:\JavaSE\chapter01
目录,然后在地址栏输入 cmd
:
命令:javac Java源文件名.后缀名java
,这里是 javac HelloWorld.java
编译成功后,命令行没有任何提示。打开 D:\JavaSE\chapter01
目录,发现产生了一个新的文件 HelloChina.class
,该文件就是编译后的文件,是 Java 的可运行文件,称为字节码文件,有了字节码文件,就可以运行程序了。
运行
在 DOS 命令行中,在字节码文件目录下,使用 java
命令进行运行。
命令:java主类名字
,这里是 java HelloChina
,错误:java HelloChina.class
主类是指包含 main
方法的类,main
方法是 Java 程序的入口:
public static void main(String[] args) {
}
Java 开发工具
级别一:文本开发工具
级别二:集成开发环境
集成开发环境(Integrated Development Environment,IDE)
如何选择
- 前期我们先使用文本开发工具,培养代码感,利于公司笔、面试。
- 后期我们使用 IDE,提供更强大的功能支持。
HelloWorld 案例常见错误
拼写问题
- 单词拼写问题
- 正确:
class
;错误:Class
- 正确:
String
;错误:string
- 正确:
System
;错误:system
- 正确:
main
;错误:mian
- 正确:
- Java 语言是一门严格区分大小写的语言
- 标点符号使用问题
- 不能用中文符号,要使用英文半角的标点符号
- 括号问题,成对出现
编译、运行路径问题
举例 1:
- 源文件名不存在或者写错
- 当前路径错误
- 后缀名隐藏问题
举例 2:
- 类文件名写错,尤其文件名与类名不一致时,要小心
- 类文件不在当前路径下,或者不在
classpath
指定路径下
语法问题
举例 1:声明为 public
的类应与文件名一致,否则编译失败。
举例 2:编译失败,注意错误出现的行数,再到源代码中指定位置改错
字符编码问题
当 cmd 命令行窗口的字符编码与 .java
源文件的字符编码不一致,如何解决?
- 解决方案一:修改源代码编码
- 解决方案二:在使用
javac
命令时,可以指定源文件的字符编码:javac -encoding utf-8 Review01.java
建议
- 注意缩进!
- 一定要有缩进。缩进就像人得体的衣着一样!
- 只要遇到
{}
就缩进,缩进的快捷键tab
键。
- 必要的空格
- 变量类型、变量、赋值符号、变量值之间填充相应空格,更美观。比如:
int num = 10;
- 变量类型、变量、赋值符号、变量值之间填充相应空格,更美观。比如:
HelloWorld 小结
Java 程序的结构与格式
结构:
类 {
方法 {
语句;
}
}
格式:
- 每一级缩进一个
Tab
键 {}
的左半部分在行尾,右半部分单独一行,与和它成对的”{
“的行首对齐
Java 程序的入口
Java 程序的入口是 main
方法
public static void main(String[] args) {
}
两种常见的输出语句
- 换行输出语句:输出内容,完毕后进行换行,格式如下:
System.out.println(输出内容);
- 直接输出语句:输出内容,完毕后不做任何处理,格式如下:
System.out.print(输出内容);
注意事项:
- 换行输出语句,括号内可以什么都不写,只做换行处理
- 直接输出语句,括号内什么都不写的话,编译报错
源文件名与类名
问:源文件名是否必须与类名一致?public
呢?
答:
如果这个类不是 public
,那么源文件名可以和类名不一致。但是不便于代码维护。
如果这个类是 public
,那么要求源文件名必须与类名一致。否则编译报错。
我们建议大家,不管是否是 public
,都与源文件名保持一致,而且一个源文件尽量只写一个类,目的是为了好维护。
问:一个源文件中是否可以有多个类?public
呢?
答:
一个源文件中可以有多个类,编译后会生成多个 .class
字节码文件。
但是一个源文件只能有一个 public
的类。
Java 中的注释与 API 文档
注释(comment)
什么是注释
源文件中用于解释、说明程序的文字就是注释。
注释是一个程序员必须要具有的良好编程习惯。实际开发中,程序员可以先将自己的思想通过注释整理出来,再用代码去体现。
程序员最讨厌两件事:
- 一件是自己写代码被要求加注释
- 另一件是接手别人代码,发现没有注释
注释的作用:
- 它提升了程序的可阅读性
- 调试程序的重要方法。
Java 中的注释类型
单行注释:
// 注释文字
多行注释:
/*
注释文字1
注释文字2
注释文字3
*/
文档注释(Java 特有):
/**
@author 指定 java 程序的作者
@version 指定源文件的版本
*/
- 对于单行和多行注释,被注释的文字,不会不会出现在字节码文件中,进而不会被 JVM(Java 虚拟机)解释执行。
- 多行注释里面不允许有多行注释嵌套。
- 文档注释内容可以被 JDK 提供的工具
javadoc
所解析,生成一套以网页文件形式体现的该程序的说明文档。
操作方式,比如:javadoc -d mydoc -author -version HelloWorld.java
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
Java 核心机制:JVM
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 程序在该系统中的运行。
- 面向对象性:面向对象是一种程序设计技术,非常适合大型软件的设计和开发。面向对象编程支持封装、继承、多态等特性,让程序更好达到高内聚、低耦合的标准。
- 健壮性:吸收了 C/C++ 语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制。
- 安全性高:Java 适合于网络/分布式环境,需要提供一个安全机制以防恶意代码的攻击。如:安全防范机制(ClassLoader 类加载器),可以分配不同的命名空间以防替代本地的同名类、字节代码检查。
- 简单性:Java 就是 C++ 语法的简化版,我们也可以将 Java 称之为“C++—”。比如:头文件,指针运算,结构,联合,操作符重载,虚基类等。
- 高性能:
- Java 最初发展阶段,总是被人诟病“性能低”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免。Java 语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如,通过 JIT(JUST IN TIME)即时编译技术提高运行效率。
- Java 低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多 C++ 应用转到 Java 开发,很多 C++ 程序员转型为 Java 程序员。
缺点
- 语法过于复杂、严谨,对程序员的约束比较多,与 Python、PHP 等相比入门较难。
- 一般适用于大型网站开发,整个架构会比较重,对于初创公司开发和维护人员的成本比较高(即薪资高),选择用 Java 语言开发网站或应用系统的需要一定的经济实力。
- 并非适用于所有领域。比如,Objective C、Swift 在 iOS 设备上就有着无可取代的地位。浏览器中的处理几乎完全由 JavaScript 掌控。Windows 程序通常都用 C++或 C# 编写 。Java 在服务器端编程和跨平台客户端应用领域则很有优势。
JVM 功能说明
JVM(Java Virtual Machine,Java 虚拟机):是一个虚拟的计算机,是 Java 程序的运行环境。JVM 具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。
功能 1:实现 Java 程序的跨平台性
我们编写的 Java 代码,都运行在 JVM 之上。正是因为有了 JVM,才使得 Java 程序具备了跨平台性。
使用 JVM 前后对比:
功能 2:自动内存管理(内存分配、内存回收)
- Java 程序在运行过程中,涉及到运算的数据的分配、存储等都由 JVM 来完成
- Java 消除了程序员回收无用内存空间的职责。提供了一种系统级线程跟踪存储空间的分配情况,在内存空间达到相应阈值时,检查并释放可被释放的存储器空间。
- GC 的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上减少了因为没有释放空间而导致的内存泄漏。
面试题:
Java 程序还会出现内存溢出和内存泄漏问题吗? Yes!