Java
美梦的交织来源于无数个光点 -- 风尘尘风
一、Java 初识
Java 概述、Java 特点、Java 历史、Java 体系、Java 工具、Java 组成
1.1 Java 概述
Java 概念、Java 之父、Java 起名、Java 图标、Java 公司、Java 由来
1. Java 概念
- Java 概念:Java 是一种流行的编程语言,创建于1995年
计算机科学语言的发展流程:机器语言->汇编语言->高级语言
2. Java 之父
- Java 之父:加拿大的詹姆斯·高斯林 (James Gosling)
詹姆斯·高斯林是 Java 编程语言的共同创始人之一,但一般公认他为"Java 之父"
3. Java 起名
- Java 起名:早期 Java 叫做 Oak(橡树),后因商标注册问题改名为 Java
Oak 改名为 Java 是因为开发者们喜欢喝来自爪洼岛生产的咖啡,所以起名 Java
4. Java 图标
- Java 图标:一杯浓浓的热咖啡
很多编程语言的图标都含义丰富,同时有一套计算机界出名的"黑皮书",其封面的不同动物就是不同的编程含义
5. Java 公司
- Java 公司:Java 起初由 Sun 公司发明,但后因效益被 Oracle(甲骨文)公司于 2009 年收购
Oracle 公司目前有 Java(编程语言)、SOLARIS(Unix)、MySQL(数据库)、Oracle(数据库)等产品
6. Java 由来
- Java 由来:在 C++ 、C 的基础上发展,但摒弃了 C++ 的指针、多继承、运算符重载、自动强转
编程语言的产生很多都是"取其精华去其糟粕",所以只要学会、学好、学懂一门编程语言,利于其他语言的学习
1.2 Java 特点
简单、健壮、安全、动态、分布式、多线程、高性能、解释型、可移植
面向对象、开源免费、社区完善、快速强大、前景广阔、体系结构中立
1. 简单
-
Java 语法与 C、C++ 语言很接近,使大多数程序员易学习和使用
-
Java 丢弃了 C++ 中的糟粕,如:操作符重载、多继承、自动的强制类型转换
-
Java 不使用指针而是引用,并且提供自动分配和回收内存空间,使程序员不必为内存管理而担忧
Java 的垃圾回收机制(Garbage Collection, GC)会自动分配和回收内容空间
2. 健壮
- Java 的健壮来源于它的强类型机制、异常处理、垃圾的自动收集、指针丢弃、安全检查机制等
健壮指能对程序的各种非法地输入进行很好地处理,并使程序能正常地继续运行,即程序的稳定
3. 安全
- Java 提供了安全防范机制(类 ClassLoader)、安全管理机制(类 SecurityManager)以防攻击
Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如:字节代码检查
4. 动态
- Java 程序需要的类能动态被载入到运行环境,也可通过网络来载入所需要的类,有利于软件升级
Java 中的类有一个运行时刻的表示,能进行运行时刻的类型检查
5. 分布式
- Java 提供了 RMI (Remote Method Invocation) 远程方法激活机制,实现其分布式
Java 支持 Internet 应用的开发,包括 URL、URLConnection、Socket、ServerSocket 等
6. 多线程
-
Java 的线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建
-
Java 线程创建一:从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程
-
Java 线程创建二:用 Thread(Runnable) 的构造子类将实现了 Runnable 接口的对象包装成线程
Java 支持多线程同时执行且提供了多线程之间的同步机制(关键字为 synchronized)
7. 高性能
- Java 与解释型的高级脚本语言(Python)相比是高性能的
越接近于底层的编程语言,其运行速度越快但相应的代码编写较难(如:C)
Java 的运行速度随 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++
8. 解释型
- Java 的程序执行实质是先编译成字节码格式,再用 Java 解释器对字节码进行解释执行
Java 有纯解释执行、纯编译执行(JRockit)、解释+编译混用(HotSpot),即 JVM 的不同
解释执行指将 JVM 指令逐行翻译为本地机器码逐行解释执行,其程序启动速度很快但执行速度很慢
编译执行指将 Class 文件直接编译成机器码并缓存让 CPU 可直接执行,执行速度快但编译耗时且程序启动慢
9. 可移植
-
Java 的可移植来源于它的体系结构中立、强类型机制(严格规定各个基本数据类型长度)
-
Java 系统本身也有可移植性,因为 Java 编译器用 Java 实现而 Java 运行环境用 ANSI C 实现
Java 可移植性指跨平台(Win、Linux、Mac),即"Wirte once,Run Everywhere,WORE"一次编写到处运行
10. 面向对象
- Java 提供类、接口、继承、封装、多态等面向对象的特性
面向对象的三大特性:继承、封装、多态
Java 全面支持动态绑定,而 C++ 只对虚函数使用动态绑定
面向过程指以事件为中心即按部就班地解决问题,面向对象指以对象为中心即万事万物都是对象
Java 为了简单只支持类的单继承但支持接口的多继承和类与接口之间的实现机制(关键字为 implements)
11. 开源免费
- Java 是开源免费的,所有人都可免费获取、修改其源代码,但仅限其免费版,Java 也有收费版
著名开源组织一:Mozilla 基金会 (Mozilla Foundation)
著名开源组织二:自由软件基金会(Free Software Foundation,FSF)
著名开源组织三:Apache 软件基金会(Apache Software Foundation,ASF)
12. 社区完善
- Java 的社区完善,即有许多活跃的程序员参与社区建设,进而推动了 Java 的积极发展
著名社区:Stack Overflow、GitHub、CSDN、掘金、博客园、开源中国
13. 快速强大
- Java 的程序开发周期短且能开发的领域广
Java 开发领域:网站、服务器程序、安卓 App 开发、Web 前端、J2ME系统、软件工具、嵌入式、大数据
14. 前景广阔
- Java 的相关岗位有 Java 开发工程师、Java测试工程师、Java 架构师、大数据工程师
据估算全球约有 150 亿台设备在运行 Java
15. 体系结构中立
- Java 程序(.java 文件)在 Java 平台上被编译为体系结构中立的字节码格式(.class 文件)
Java 体系结构中立使得其适合于异构的网络环境和软件的分发,也荣获"平台独立语言"的美誉
1.3 Java 历史
Java 诞生日期、JDK 诞生日期、Java 版本发展
1. Java 诞生日期
- Java 诞生日期:Java 诞生于 1995 年 5 月 23 日
Python 诞生于 1989 年但其流行度前期不如Java,很大原因都在于资源
2. JDK 诞生日期
- JDK 诞生日期:第一个 JDK1.0 诞生于 1996 年 1 月
JDK(Java Development Kit)Java 开发工具,即用来开发 Java程序的工具
3. Java 版本发展
- JDK1.1、JDK1.3、JDK1.5(J2SE1.5/Java SE5.0)、JDK1.8(Java8/Java SE8)、Java11/17
一般所说的 Java 指 Java SE
截至目前 Java 最新版本为 Java 20
Java One 大会指全球 Java 开发者的盛会
常用JDK版本:JDK1.8(含 GUI 编程包Swing)、Java11、Java17
JDK1.8 又名叫 Java8 或 Java SE8,因为凸显 JDK 的重要性所以由小数改为整数命名
1.4 Java 体系
Java 体系分类
1. Java 体系分类
- Java 体系分为 JavaSE(J2SE)、JavaEE(J2EE)、JavaME(J2ME)
Java SE 是最重要的核心,因为它是Java EE 的基础
Java ME(J2 ME) 指(Java2 Platform Micro Edition)Java 平台微型版,用于嵌入式开发
Java SE(J2 SE) 指(Java2 Platform Standard Edition)Java 平台标准版,用于桌面程序开发
Java EE(J2 EE) 指(Java2 Platform Enterprise Edition)Java 平台企业版,用于企业程序开发
SUN 取消了之前的数字"2"命名,即:J2EE 变为 Java EE,J2SE 变为 Java SE,J2ME 变为 Java ME
1.5 Java 工具
文本编辑器、IDE
1. 文本编辑器
- Java 编写的文本编辑器:VS Code(Visual Studio Code)、SublimeText3、Emacs、Vim
Emacs 被称为"神的编辑器"(GNU 的开源编辑器),Vim被称为"编辑器之神"(Vi 的图形化界面)
Java 还可用系统自带记事本或下载其升级版 Notepads 编写程序,实质是调用 JDK 的 javac、java 工具
2. IDE
- Java 编写的 IDE:Eclipse、 MyEclipse、IntelliJ IDEA、NetBeans、VS(Visual Studio)
IDE(Integrated Development Environment)集成开发环境,用于代码编写
MyEclipse 是 Eclipse 的升级版,MyEclipse 收费但 Eclipse 免费,主流的 Java IDE
IntelliJ IDEA 是 JetBrains 的著名产品(其公司还有许多广为人知的 IDE),主流的 Java IDE
NetBeans 是 Apache 推出的 Java IDE,它有 GUI(用户图形化接口) 编程,但不是主流的 Java IDE
VS(Visual Studio)是大名鼎鼎的微软公司推出的插件"集合体",它随好用但太占电脑资源,不是主流 IDE
Java 可用诸多的 IDE 编写 Java 程序,实质是集成了 JDK 的 javac、java 工具,进而对 Java 解释执行
1.6 Java 组成
JDK 组成
1. JDK组成
- JDK = JRE + 开发工具集(如:javac 编译工具、java 运行工具)、JRE = JVM + Java SE 标准类库
JDK(Java Development Kit)Java 开发工具包,用于Java 程序的开发
JRE(Java Runtime Environment)Java 运行环境,用于 Java 程序的运行
只要安装 JDK 就不用额外安装 JRE,开发 Java 须有 JDK,运行可有或可无 JRE(将 Java 程序打包)
JVM(Java Virtual Machine)Java 虚拟机,不同平台对应不同 JVM 以实现跨平台,只认识 .class 文件
二、Java 开发
Java 环境、Java 编程
2.1 Java 环境
Java 环境要求、Java 环境搭建
1. Java 环境要求
- Java 环境要求:JDK(JRE)+ IDE/文本编辑器
Java SE 重要补丁更新 (CPU)的 CPU 版本号采用奇数编号,所以推荐下载 JDK 最后一位数字是奇数的版本
2. Java 环境搭建
- Java 环境搭建先去 Oracle 官网下载 JDK,然后配置 JDK 系统环境变量,最后调用或集成 JDK
配置 JDK 系统环境变量是为了后续的 Java 安装是否成功的验证、Java 后续的文本编辑器的使用
Oracle 下载 JDK 的前提是注册一个 Oracle 账号,同时可规避流氓软件的侵袭,官网网址大多含品牌名
2.2 Java 编程
Java 编程规范、Java 开发流程、Java组织架构、Java 程序分类、Java 你好世界
1. Java 编程规范
(1). 代码注释
- 代码注释用于对代码进行解释说明,是程序非执行部分,适当添加注释可提高程序可读性、可维护性
多行注释可嵌套单行注释,但反过来不行因为毫无意义
文档注释会自动生成 HTML 的代码注释,由 javadoc 工具完成
Java 提供 3 种添加注释的方法,分别是单行注释(//)、多行注释(/**/)、文档注释(/***/)
(2). 合理缩进
- Java 的代码块最好用 4 个空格进行悬挂式缩进,且同一级别的代码块的缩进量尽量相同
类、方法、条件语句、循环语句中的代码都采用缩进方式
尽量不要将空格键和 Tab 键混用,以免造成代码结构的混乱
若用 Tab 键缩进,在代码编辑器中默认将 1 个 Tab 键视为 4 个空格,可手动修改
代码的缩进在 IDEA 中通常用快捷键 Ctrl + Alt + L 自动完成代码格式优化,而不手动调缩进
(3). 适当换行
- Java每行代码的长度最好不要超过 120 个字符,对于过长的代码建议换行
Java 的换行用加号"+"即字符连接符实现,Python 的换行用反斜杠"\"即转义符实现
(4). 空格空行
- 合理适当的空格和空行对于程序的结构是事半功倍的
左、右小括号和字符之间不出现空格
if/for/while/switch/do 等保留字与括号之间都必须加空格
没有必要增加若干空格来使某一行的字符与上一行对应位置的字符对齐
若大括号内为空则简洁地写成{}即可即不需要换行,若非空则左大括号前不换行、右大括号前换行
(5). 命名规范
-
常量名全大写且用下划线分割,包名一律小写
-
类的命名用驼峰式命名的规范(大驼峰命名法)
-
方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头(小驼峰命名法)
上述所有的代码规范以及规则都可通过 IDEA 自动完成
2. Java 开发流程
(1). 需求分析
- 需求分析:分析代码是做什么的、输入的参数是什么、输出的参数是什么
(2). 算法设计
- 算法设计:对要解决的问题设计出解决问题的方法和具体步骤
(3). 编写程序
- 编写程序:用 Java 编写代码,实现需求分析和算法设计的功能
(4). 编译程序
- 编译程序:用 Java 编译器将写好的代码编译成为计算机所能识别的,能够运行的二进制文件
(5). 运行程序
- 运行程序:将编译好的二进制文件运行,真正能够处理需求分析所提出的问题
(6). 编写文档
- 编写文档:编写用户的使用说明书
3. Java 组织架构
- Java 由各种各样的类构成,类中需要嵌套方法和变量进而实现功能
方法指类的行为即用来完成动作,变量指类的特征即用来描述动作
4. Java 程序分类
- Java 程序分为 Java 小程序(Java Applet)、Java 应用程序(Java Application)
Java 小程序没有 main() 方法,嵌入在 HTML 文档中,由浏览器或 appletviewer 加载执行
Java 应用程序以 main() 方法作为程序入口,由 Java 虚拟机记载执行,可作为独立的程序运行
5. Java 你好世界
- 可用文本编辑器(如:记事本)或 IDE 编写程序,初学者建议记事本编写代码,以免眼高手低
System.out.println("Hello World!");
三、Java 语法
Java 标识符
3.1 Java 标识符
Java 标识符概念、Java 标识符规范
1. Java 标识符概念
- Java 标识符概念:标识的符号即类、对象、变量、方法、数组等的名字,用于区分
一个程序中标识符不能重名
所有命名都要求言简意赅,具体形象
对象采用类名的小写命名,如:scanner
类采用大驼峰命名法,如:HelloWorld{}
变量、方法采用小驼峰命名法,如:helloWorld、helloWorld()
数组的书写方式有两种,如:String[] args、String args[],推荐 String[] args
2. Java 标识符规范
- Java 标识符规范:由字母、数字、下划线(_)、美元符号($)组成,无长度限制
Java 关键字、保留字等不能作为用户自定义标识符使用
标识符的首字符必须是字母、下划线、美元符号,不能是数字
标识符中的字母是区分大小写的,如:Dog 和 dog 是不同的标识符
常量通常以大写字母英文单词命名,变量通常以小写字母英文单词命名
若一个变量名由多个单词构成,则第一个单词小写,第二个单词首字母大写(小驼峰)
类标识符通常以大写英文字母开始,由多个单词构成,则每个单词的首字母都大写其余字母都小写(大驼峰)
3.2 Java 关键字
Java 关键字概念、Java 关键字大全
1. Java 关键字概念
- Java 关键字概念(keyword):编程语言预先定义的标识符,用户不能将其用作自定义标识符
2. Java 关键字大全
- Java 关键字大全:Java 总共 53 个关键字(48关键字 + 2保留字 + 3直接变量),常见的有 class
3.3 Java 的变量
1. Java 的变量概念
- Java 的变量概念:在程序运行过程中其值可改变的量,用于在程序运行时临时存放数据
2. Java 的变量声明
- Java 的变量声明格式:类型 变量名1 [= 初值1][, 变量名2 [= 初值2]……];
所有变量必须先声明再使用,不能无中生有,否则报错
变量初始化后还可对变量重新赋值,重新赋值后新的值将会覆盖原来的值
Java 的变量声明格式有一段式(同时声明赋值)、二段式(先声明再赋值)
一般在 API 文档及格式中的 "[]" 代表可选项,如上述 Java 的变量声明格式中的初值是可选项
Java 允许用汉字或其他语言文字作为变量名但不建议,声明变量时应选择有意义的单词作为变量名
3. Java 的变量范围
- Java 的变量范围分类:成员变量、全局变量
局部变量尽量避免与全局变量重名
变量在声明时可以不赋初值,但在使用变量前必须对其赋值(建议声明时就赋初值)
为使变量在类或方法的整个范围内有效,通常将变量声明到类或方法的最上方(顺序执行代码)
成员变量指在类体中定义的变量,它在整个类中,自声明变量处开始到整个类结束的范围内有效
局部变量指在类的方法内部定义的变量,它只在当前方法中,自变量声明处开始到方法结束范围内有效
在小范围内使用大范围变量时,有些情况下小范围将其修改后,会影响大范围变量的值(方法中用成员变量)
3.4 Java 的常量
1. Java 的常量概念
- Java 的常量概念:程序运行过程中其值不能改变的量,通常也称为"final变量",程序中只能赋值一次
2. Java 的常量语法
- Java 的常量语法:final 类型 常量名 [= 初值];
若程序中多处引用某个值则可将它定义为常量,这样既可以避免反复输入,也可在这避免多处修改
3.5 Java 的基本数据类型
Java 的基本数据类型分类、Java 的基本数据类型分类的整型
Java 的基本数据类型的浮点型、Java 的基本数据类型的字符型、Java 的基本数据类型的布尔型
1. Java 的基本数据类型分类
- Java 的基本数据类型分类:总共有 4 类 即 8 种
字符型(char)
布尔型(boolean)
浮点型(float、double)
整型(byte、short、int、long)
每一个基本数据类型都对应着一个包装类,且其包装类的名称是基本数据类型的关键字名称的全称
2. Java 的基本数据类型的整型
- 整型大小:byte 字节整型占1字节、short 短整型占2字节、int 整型占4字节、long 长整型占8字节
一个字节(Byte/B)等于八个位(bit/b)
通过一个位上的两种变化(二进制),进而推出整型的取值范围(最大值 -1,因为有 0)
Java 默认的整型数据为 int,若要用 long 请在末尾加 L 或 l,建议加 L 因为便于与 1 区分识别
- 整型表示:二进制(0b 或 0B 开头)、八进制(0 开头)、十进制、十六进制(0X 或 0x 开头)
二进制取值:0,1
八进制取值:0,1,2,3,4,5,6,7
十进制取值:0,1,2,3,4,5,6,7,8,9
十六进制取值:0,1,2,3,4,5,6,7,8,9,A/a,B/b,C/c,D/d,E/e,F/f
若为几进制则其取值范围为:0~几进制-1,比如:十六进制取值范围为 0~15(16-1),因为有 0
3. Java 的基本数据类型的浮点型
- 浮点型大小:float 单精度浮点型占 4 字节、double 双精度浮点型占 8 字节
float 取值范围:[−3.4028235e38~−1.4e−45] ∪ [1.4e−45~3.4028235e38]
double 取值范围:[−1.7976931348623157e308~−4.9e−324] ∪ [4.9e−324~1.7976931348623157e308]
float 和 double 的取值范围计算方式与整型不同,float 和 double 计算较为复杂,若有兴趣可自行研究
- 浮点型表示:小数表示法、科学表示法
科学表示法的组成:整数 + 小数 + 指数
小数表示法指由整数部分和小数部分组成,如:float num = 4.0f;
Java 的浮点型数据默认为 double,若要用 float 请在数字末尾加 f 或 F
"E"或"e"前必须有数字,指数部分可正可负但必须都是整数,"E"或"e"代表 10
Java 的默认基本数据类型为 int、double,因为这样可以尽量保证数据的准确性
科学表示法指在小数表示法后加“E”或“e”及指数部分,常用来表示很大或很小的数,如:f2 = 4.2e-5F;
4. Java 的基本数据类型的字符型
-
字符型大小:char 字符型占 2 字节
-
字符型概念:用单引号括起来的一个字符,它是区分大小写的,如:'A'和'a'是两个不同的字符
双引号括起来的字符叫做字符串,字符和字符串不一样,因为字符是'基数'而字符串是"引数"
- 字符型表示:字符(字母、数字...)、Unicode 字符集中的位置(如:字符 a 的位置是 97)
char c1 = 97; // 打印输出字符 a
char c2 = 'a'; // 打印输出字符 a
常用的字符-数字映射表有 ASCII 码表,常用的字符有 a~z(97~122)、A~Z(65~90)
Unicode(Uniform code)统一字符集,又叫"万国码",用于保证内容不乱码,常用的有 "UTF-8"
- 转义字符:用于显示一些无法正常显示的字符,如:回车符、换行符等
常用转义符:\n 换行、\t 制表符、\\ 反斜杠字符、\uxxxx unicode 的十六进制表示
\\ 反斜杠字符是用于代码中的路径书写,请注意它不是单行注释,路径书写方式有"/"或"\\"
5. Java 的基本数据类型的布尔型
-
布尔型大小:boolean 布尔型占 1 字节
-
布尔型取值:true(逻辑真)、false(逻辑假)
Java 的 true(逻辑真)和 false (逻辑假)不能用 1(非 0) 或 0 表示,和 C/C++ 的非 0 即真不一样
3.6 Java 的引用数据类型
- 引用数据类型:除 8 种基本数据类型以外,全是引用数据类型,常见的有类、接口、数组
引用类型在堆里且引用的是内存中的地址编号,基本类型在栈里且引用的是内存中的存储数值
String 是内置的字符串类而不是基本数据类型,之所以可以像基本数据类型那样使用,是因为进行了封装