Java 的应用领域

学 Java 干什么?

  1. 后端开发
  2. 大数据相关

企业级应用领域(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.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.11公司
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
Java 17.02021.09发布 Java 17.0,版本号也称为 21.9,是长期支持版本
Java 19.02022.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.exejavac.exe 等工具的时候都进入到 JDK 的安装目录下,太麻烦了。这时就需要配置 path 环境变量。

配置 JAVA_HOMEpath 环境变量

  • JAVA_HOME:JDK 安装目录,如:D:\develop_tools\jdk\jdk1.8.0_271
  • Path:添加 %JAVA_HOME%\bin

环境变量配置完成,重启 DOS 命令行,在任意目录下输入 javacjavajava -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 文件进行运行

编写

  1. 在 D:\JavaSE\chapter01 目录下新建文本文件,完整的文件名修改为 HelloWorld.java,其中文件名为 HelloWorld,后缀名必须为 .java
  2. 用记事本或 editplus 等文本编辑器打开(虽然记事本也可以,但是没有关键字颜色标识,不利于初学者学习)
  3. 在文件中输入如下代码,并且保存:
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 文档:

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!