第01章_Java语言概述
1. Java知识脉络图
1.1 Java基础全程脉络图
1.2 本章专题与脉络
6. Java语言概述
6.1 Java概述
是
SUN
(Stanford University Network,斯坦福大学网络公司 )1995年
推出的一门高级编程语言。是一种面向Internet的编程语言。Java一开始富有吸引力是因为Java程序可以在
Web浏览器
中运行。这些Java程序被称为Java小程序
(applet),内嵌在HTML代码中。伴随着互联网的迅猛发展,以及Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。
6.2 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 | 1996.08.12 | 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。 |
6.3 Java之父
詹姆斯·高斯林(James Gosling)
先生以“Java 技术之父”而闻名于世。他是Java
技术的创始人,他亲手设计了Java语言,并开发了Java编译器和Java虚拟机,使Java成为了世界上最流行的开发语言。- James Gosling于1984 年加入Sun公司,并一直服务于Sun公司,直至2010年前后,Sun被Oracle并购而加入Oracle,担任客户端软件集团的首席技术官;
2010年4月从Oracle离职。
6.4 公司八卦
- 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 月,美国最高法院给出了最终裁决:谷歌胜诉,其代码属于“合理使用”的范畴。为期十多年的软件行业“第一版权案”落幕。
6.5 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
- 支持Java程序运行在
注意:
Android开发不等同于Java ME的开发
7. Java开发环境搭建(掌握)
7.1 什么是JDK、JRE
- JDK (
J
avaD
evelopmentK
it):是Java程序开发工具包,包含JRE
和开发人员使用的工具。 - **JRE ** (
J
avaR
untimeE
nvironment) :是Java程序的运行时环境,包含JVM
和运行时所需要的核心类库
。
如下是Java 8.0 Platform:
小结:
JDK = JRE + 开发工具集(例如Javac编译工具等)
JRE = JVM + Java SE标准类库
7.2 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
意味着:springboot3.0 是需要用java17和spring6.0为基础建设。如果从企业选型最新springboot3.0作为架构来说,它搭配jdk17肯定是标配了。
7.3 JDK的下载
- 下载网址(Oracle公司官网):www.oracle.com
- 下载步骤:如图所示,在官网底部选择Developers开发者
(1)在Developers页面中间的技术分类部分,选择Java
,单击进入,如图所示:
(2)这里展示的是最新Java版本,例如Java17。单击Download Java
,然后选择具体的版本下载。
(3)选择Download Java按钮后
(4)如果想安装Java8 可以选择如下位置:
(5)选择Accept License Agreement,
(6)注册或登录后下载:
(7)如果需要安装其它版本,可以选择Java archive:
接着进行选择下载即可:
7.4 JDK的安装
- 安装说明
- 傻瓜式安装,下一步即可。
- 建议:安装路径不要有中文或者空格等特殊符号。
- 本套课程会同时安装JDK8 和 JDK17,并以JDK17为默认版本进行讲解。
- 安装步骤:
(1)双击jdk-17_windows-x64_bin.exe
文件,并单击下一步,如图所示:
(2)修改安装路径,单击更改,如图所示:
(3)将安装路径修改为D:\develop_tools\jdk\jdk-17.0.2\
,并单击下一步,如图所示:
(4)稍后几秒,安装完成,如图所示:
7.5 配置path环境变量
7.5.1 理解path环境变量
什么是path环境变量?
答:window操作系统执行命令时,所要搜寻的路径。
为什么配置path?
答:希望在命令行使用javac.exe等工具时,任意目录下都可以找到这个工具所在的目录。
以JDK为例演示
我们在C:\Users\songhk
目录下使用javac命令,结果如下:
我们在JDK的安装目录的bin目录下使用javac命令,结果如下:
我们不可能每次使用java.exe,javac.exe等工具的时候都进入到JDK的安装目录下,太麻烦了。这时就需要配置path环境变量。
7.5.2 JDK8配置方案1:只配置path
- 步骤:
(1)打开桌面上的计算机,进入后在左侧找到此电脑
,单击鼠标右键
,选择属性
,如图所示:
(2)选择高级系统设置
,如图所示:
(3)在高级
选项卡,单击环境变量
,如图所示:
(4)在系统变量
中,选中Path
环境变量,双击
或者点击编辑
,如图所示:
(5)点击新建
,填入D:\develop_tools\jdk\jdk1.8.0_271\bin
,并将此值上移
到变量列表的首位。如图所示:
- 编辑模式1:
- 编辑模式2:(注意,结尾需要有英文模式下的;)
(6)环境变量配置完成,重新开启DOS命令行,在任意目录下输入javac
或java
命令或java -version
,运行成功。
7.5.3 JDK8配置方案2:配置JAVA_HOME+path(推荐)
- 步骤:
(1)打开桌面上的计算机,进入后在左侧找到计算机
,单击鼠标右键
,选择属性
,如图所示:
(2)选择高级系统设置
,如图所示:
(3)在高级
选项卡,单击环境变量
,如图所示:
(4)在系统变量
中,单击新建
,创建新的环境变量,如图所示:
(5)变量名输入JAVA_HOME
,变量值输入 D:\develop_tools\jdk\jdk1.8.0_271
,单击确定
,如图所示:
(6)选中Path
环境变量,双击
或者点击编辑
,如图所示:
(7)在变量值的最前面,键入%JAVA_HOME%\bin
。如图所示:
注意:强烈建议将%JAVA_HOME%\bin声明在path环境变量中所有变量的最前面!
(8)环境变量配置完成,重启DOS命令行,在任意目录下输入javac
或java
命令或java -version
,运行成功。
我想说:
有的书籍、论坛、视频上还提到配置classpath,用于指名class文件识别的路径。其实是没必要的,反而建议大家如果配置了classpath环境变量,要删除。对于初学者,反而不友好。
小结如下:
7.5.4 JDK17配置方案:自动配置
不管大家有没有提前安装JDK8或其它版本JDK,在我们安装完JDK17之后,理应按JDK8的方式配置path环境变量。但是,我们发现在安装完JDK17以后,配置环境变量之前,执行CMD指令:
竟然成功了!而且是17.0.2版本。因为JDK17在安装之后,自动进行了环境变量的配置。如下:
这里建议,将JDK17安装的路径,设置为JAVA_HOME,并将%JAVA_HOME%\bin
上移到首位。
思考:如果你仍然希望在JDK8下开发Java程序?如何做呢?
8. 开发体验:HelloWorld(掌握)
JDK安装完毕,我们就可以开发第一个Java程序了,习惯性的称为:HelloWorld。
8.1 开发步骤
Java程序开发三步骤:编写、编译、运行。
- 将 Java 代码编写到扩展名为 .java 的源文件中
- 通过 javac.exe 命令对该 java 文件进行编译,生成一个或多个字节码文件
- 通过 java.exe 命令对生成的 class 文件进行运行
8.2 编写
(1)在D:\JavaSE\chapter01
目录下新建文本文件,完整的文件名修改为HelloWorld.java
,其中文件名为HelloWorld
,后缀名必须为.java
。
(2)用记事本或editplus等文本编辑器打开(虽然记事本也可以,但是没有关键字颜色标识,不利于初学者学习)
(3)在文件中输入如下代码,并且保存:
友情提示1:每个字母和符号必须与示例代码一模一样,包括大小写在内。
友情提示2:
或
第一个HelloWord
源程序就编写完成了,但是这个文件是程序员编写的,JVM是看不懂的,也就不能运行,因此我们必须将编写好的Java源文件
编译成JVM可以看懂的字节码文件
,也就是.class
文件。
8.3 编译
在DOS命令行中,进入D:\JavaSE\chapter01
目录,使用javac
命令进行编译。
使用文件资源管理器打开D:\JavaSE\chapter01
目录,然后在地址栏输入cmd。
命令:
举例:
编译成功后,命令行没有任何提示。打开D:\JavaSE\chapter01
目录,发现产生了一个新的文件 HelloChina.class
,该文件就是编译后的文件,是Java的可运行文件,称为字节码文件,有了字节码文件,就可以运行程序了。
8.4 运行
在DOS命令行中,在字节码文件目录下,使用java
命令进行运行。
命令:
主类是指包含main方法的类,main方法是Java程序的入口:
举例:
错误演示:
java HelloChina.class
9. Java开发工具
9.1 都有哪些开发Java的工具
- 级别一:文本开发工具
- 级别二:集成开发环境(Integrated Development Environment,IDE)
把代码编写,编译,执行,调试等多种功能综合到一起的开发工具。
9.2 如何选择
前期我们先使用文本开发工具,培养代码感
,利于公司笔、面试。
后期我们使用IDE,提供更强大的功能支持
。
10. HelloWorld案例常见错误
10.1 拼写问题
- 单词拼写问题
- 正确:class 错误:Class
- 正确:String 错误:string
- 正确:System 错误:system
- 正确:main 错误:mian
- Java语言是一门严格区分大小写的语言
- 标点符号使用问题
- 不能用中文符号,英文半角的标点符号(正确)
- 括号问题,成对出现
10.2 编译、运行路径问题
举例1:
- 源文件名不存在或者写错
- 当前路径错误
- 后缀名隐藏问题
举例2:
- 类文件名写错,尤其文件名与类名不一致时,要小心
- 类文件不在当前路径下,或者不在classpath指定路径下
10.3 语法问题
举例1:
声明为public的类应与文件名一致,否知编译失败。
举例2:
编译失败,注意错误出现的行数,再到源代码中指定位置改错
10.4 字符编码问题
当cmd命令行窗口的字符编码与.java源文件的字符编码不一致,如何解决?
解决方案一:
- xxxxxxxxxx7 1public static void main(String[] args) {2 List
authors = getAuthors();3 authors.parallelStream()4
.map(author -> author.getAge())5 .mapToInt(age -> age + 10)6 .forEach(name -> System.out.println(name));7}java
- 在EditPlus中可以将Java源文件另存为ANSI编码方式(中文操作系统下即为GBK字符集)
解决方案二:
10.5 建议
注意缩进!
一定要有缩进。缩进就像人得体的衣着一样!
只要遇到{}就缩进,缩进的快捷键tab键。
必要的空格
- 变量类型、变量、赋值符号、变量值之间填充相应空格,更美观。比如: int num = 10;
11. HelloWorld小结
11.1 Java程序的结构与格式
结构:
格式:
(1)每一级缩进一个Tab键
(2){}的左半部分在行尾,右半部分单独一行,与和它成对的”{“的行首对齐
11.2 Java程序的入口
Java程序的入口是main方法
11.3 两种常见的输出语句
换行输出语句:输出内容,完毕后进行换行,格式如下:
直接输出语句:输出内容,完毕后不做任何处理,格式如下
注意事项:
换行输出语句,括号内可以什么都不写,只做换行处理
直接输出语句,括号内什么都不写的话,编译报错
11.4 源文件名与类名
(1)源文件名是否必须与类名一致?public呢?
(2)一个源文件中是否可以有多个类?public呢?
12. 注释(comment)
什么是注释?
- 源文件中用于解释、说明程序的文字就是注释。
注释是一个程序员必须要具有的良好编程习惯。实际开发中,程序员可以先将自己的
思想
通过注释整理出来,再用代码
去体现。程序员最讨厌两件事:
一件是自己写代码被要求加注释
另一件是接手别人代码,发现没有注释
不加注释的危害
Java中的注释类型:
单行注释
多行注释
文档注释 (Java特有)
注释的作用
- 它提升了程序的可阅读性。(不加注释的危害性,见图。)
- 调试程序的重要方法。
具体使用1:单行注释、多行注释
对于单行和多行注释,被注释的文字,不会不会出现在字节码文件中,进而不会被JVM(java虚拟机)解释执行。
多行注释里面不允许有多行注释嵌套。
一个段子
具体使用2:文档注释(Java特有)
文档注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。
操作方式。比如:
案例:
13. Java API文档
- API (Application Programming Interface,应用程序编程接口)是 Java 提供的基本编程接口。
- Java语言提供了大量的基础类,因此 Oracle
也为这些基础类提供了相应的说明文档,用于告诉开发者如何使用这些类,以及这些类里包含的方法。大多数Java书籍中的类的介绍都要参照它来完成,它是编程者经常查阅的资料。 - Java API文档,即为JDK使用说明书、帮助文档。类似于:
- 下载API文档:
14. Java核心机制:JVM
14.1 Java语言的优缺点
Java确实是从C语言和C++语言继承了许多成份,甚至可以将Java看成是类C语言发展和衍生的产物。“青出于蓝,而胜于蓝”。
14.1.1 优点
- 跨平台性:这是Java的核心优势。Java在最初设计时就很注重移植和跨平台性。比如:Java的int永远都是32位。不像C++可能是16,32,可能是根据编译器厂商规定的变化。
- 通过Java语言编写的应用程序在不同的系统平台上都可以运行。“
Write once , Run Anywhere
”。 - 原理:只要在需要运行 java 应用程序的操作系统上,先安装一个Java虚拟机 (
J
VM ,JavaV
irtualM
achine)
即可。由JVM来负责Java程序在该系统中的运行。
面向对象性:
面向对象是一种程序设计技术,非常
适合大型软件的设计和开发
。面向对象编程支持封装、继承、多态等特性,让程序更好达到高内聚
,低耦合
的标准。健壮性:吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制。
安全性高:
Java适合于网络/分布式环境,需要提供一个安全机制以防恶意代码的攻击。如:
安全防范机制
(ClassLoader类加载器),可以分配不同的命名空间以防替代本地的同名类、字节代码检查。简单性:
Java就是C++语法的
简化版
,我们也可以将Java称之为“C++--
”。比如:头文件,指针运算,结构,联合,操作符重载,虚基类等。高性能:
Java最初发展阶段,总是被人诟病“
性能低
”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免。Java语言本身发展中通过虚拟机的优化提升了几十倍运行效率
。比如,通过JIT(JUST IN TIME)即时编译技术提高运行效率。Java低性能的短腿,已经被完全解决了
。业界发展上,我们也看到很多C++应用转到Java开发,很多C++程序员转型为Java程序员。
14.1.2 缺点
语法过于复杂、严谨
,对程序员的约束比较多,与python、php等相比入门较难。但是一旦学会了,就业岗位需求量大,而且薪资待遇节节攀升
。- 一般适用于大型网站开发,
整个架构会比较重
,对于初创公司开发和维护人员的成本比较高(即薪资高),选择用Java语言开发网站或应用系统的需要一定的经济实力。 并非适用于所有领域
。比如,Objective
C、Swift在iOS设备上就有着无可取代的地位。浏览器中的处理几乎完全由JavaScript掌控。Windows程序通常都用C++或C#编写。Java在服务器端编程和跨平台客户端应用领域则很有优势。
14.2 JVM功能说明
JVM(J
ava V
irtual M
achine ,Java虚拟机):是一个虚拟的计算机,是Java程序的运行环境。JVM具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。
14.2.1 功能1:实现Java程序的跨平台性
我们编写的Java代码,都运行在JVM 之上。正是因为有了JVM,才使得Java程序具备了跨平台性。
使用JVM前后对比:
14.2.2 功能2:自动内存管理(内存分配、内存回收)
- Java程序在运行过程中,涉及到运算的
数据的分配
、存储
等都由JVM来完成 - Java消除了程序员回收无用内存空间的职责。提供了一种系统级线程跟踪存储空间的分配情况,在内存空间达到相应阈值时,检查并释放可被释放的存储器空间。
- GC的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上
减少了
因为没有释放空间而导致的内存泄漏
。
面试题:
Java程序还会出现内存溢出和内存泄漏问题吗? Yes!
15. 企业真题
- 一个”.java”源文件中是否可以包括多个类?有什么限制(明*数据)
答:可以包含多个类,但是有且仅有一个类能够为public类,并且该类名要和源文件名一致。
- Java的优势(阿巴)
Java社区比较繁荣,有大量的第三方框架配置
- 常用的几个命令行操作都有哪些? (北京数字)
1.javac .java文件:将.java文件编译为.class文件
2.java .class文件名:运行.class文件
- Java中是否存在内存溢出、内存泄漏?如何解决?举例说明(拼*多)
存在
- 如何看待Java是一门半编译半解释型的语言(携)*
因为java源码文件(.java)通过编译生成.class字节码文件后,可以通过解释器逐行解释运行,也可以通过JIT编译器(及时编译技术)运行。