1.1 JavaSE知识模块介绍
- 第一部分:计算机编程语言核心结构:
数据类型
、运算符
、流程控制
、数组
、… - 第二部分:Java面向对象核心逻辑:
类和对象
、封装
、继承
、多态
、构造器
、枚举
、抽象
、接口
、内部类
、注解
… - 第三部分:JavaSE核心高级应用:
集合
、I/O
、多线程
、反射机制
、… - 第四部分:Java新特性:
Lambda表达式
、函数式编程
、新Date/Time API
、接口的默认、静态和私有方法
、…
1.2 计算机语言介绍(了解)
计算机编程语言是什么
所谓计算机编程语言,就是人们使用编程语言对计算机下达的命令,让计算机完成人们需要的功能。
所谓的计算机编程语言,就是计算机能看懂的语言,我们需要学习这些计算机编程语言,给计算机下达指令,让计算机给我们完成一些功能
计算机语言发展
-
第一代:机器语言(计算机很庞大,都是0和1组成的指令,而且需要同时按下多个键才能完成一个指令,而且用0和1组成的一个一个指令,所以工程师们就要记住0和1的各种组合以及对应的指令)。
-
第二代:汇编语言(面向机器的语言,因为直接面对机器需要记一些 0 和1 的指令,很痛苦,所以就出现了很多助记词,比如:add.汇编语言现在还在使用,接近于机器语言,越接近机器语言,速度越快,而且最终还是转成0和1存储)。
-
第三代:高级语言(更接近我们人类语言,常见的有很多,比如C语言,java等)。
不管是第几代语言,最终都会向0和1靠近,因为CPU只认识0和1。 电脑上所有的内容,都是通过CPU将0和1转换而来的 。
1.3 Java语言发展历史
Java诞生于SUN(Stanford University Network),09年SUN被Oracle(甲骨文)收购。
Java之父是詹姆斯.高斯林(James Gosling)。
1996年发布JDK1.0版。大约20多年。
目前最新的版本是Java21。
1.4 Java语言特点
(1)优点
-
面向对象:Java语言支持封装、继承、多态,面向对象编程,让程序更好达到
高内聚
,低耦合
的标准。 -
支持分布式:Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
-
健壮型:Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。
-
安全性高:Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。如:安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查。
-
跨平台性:Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),然后可以在实现这个Java平台的任何系统中运行。
(2)缺点
-
语法过于复杂,严谨,对程序员的约束比较多,与python和php等相比入门相对较难。但是一旦学会了,就业岗位需求量大,而且薪资待遇节节攀升。
-
一般适用于大型网站开发,整个架构会比较重,对于初创公司开发和维护人员的成本比较高(即薪资高),选择用Java语言开发网站或应用系统的需要一定的经济实力。
1.3 Java语言跨平台原理
1、Java语言跨平台原理
很多时候,我们写的程序可能要在多个操作系统运行,这个时候就要求我们的程序需要在尽可能不改动的情况下完实现这个目标。不同的语言实现跨平台的方式不同。Java语言实现跨平台是建立在“虚拟机”基础之上的。
Java设计了一套简洁的虚拟指令集,也就是字节码。如果我们想要在一台机器上运行Java程序,只需要将Java程序编译成字节码就可以了。编写一个将Java程序翻译成Java字节码的编译器,比起编写一个将Java程序翻译成x86_64指令集的编译器来说,要简单得多。可是这里产生了一个问题,难道我们的机器可以直接执行字节码这样的虚拟指令集吗?当然是不能的。我们需要针对不同的指令集,开发对应的字节码解释器。这个工作同样比较简单。
Java虚拟机(JVM,Java Virtual Machine)是由软件技术模拟出计算机运行的一个虚拟的计算机,它负责解释执行字节码指令集。也就是说,只要一台机器可以运行Java的虚拟机,那么就能运行Java语言编写的程序。而不同的平台,需要安装不同的Java虚拟机程序。那么我们编写完Java程序之后,需要先将.java的源文件编译为.class的字节码文件,然后在Java虚拟机中来执行这些字节码文件。
Java虚拟机的设计不仅仅解决了Java程序跨平台的问题,同时解决了很多语言的跨平台问题。
-
.NET(C#,VB等语言)也有虚拟机,也能实现跨平台,但是只能在Windows操作系统下安装.NET环境。
-
C++不受虚拟机的限制,但是需要用不同平台的编译器重新编译一次。需要编写n个版本的编译器。
-
Java虚拟机可以配置在MacOS,Windows(PC操作系统),Linux等上,但是不能配置在WP(Windows Phone),IOS(移动操作系统)上,只能配置在android(移动操作系统)。Java程序可以实现一次编译处处运行。
2、JVM、JRE、JDK的关系
-
JVM(Java Virtual Machine ):Java虚拟机,是运行所有Java程序的假想计算机,是Java程序的运行环境之一,也是Java 最具吸引力的特性之一。我们编写的Java代码,都运行在JVM 之上。
-
JRE (Java Runtime Environment) :是Java程序的运行时环境,包含
JVM
和运行时所需要的核心类库
。 -
JDK (Java Development's Kit):是Java程序开发工具包,包含
JRE
和开发人员使用的工具。
我们想要运行一个已有的Java程序,那么只需安装JRE
即可。
我们想要开发一个全新的Java程序,那么必须安装JDK
,其内部包含JRE
总结:jdk包含jre,jre包含jvm
1.4 Java语言开发环境
1、JDK的下载
-
下载网址:www.oracle.com
2、JDK的安装
-
安装步骤:
-
双击
jdk-8u202-windows-x64.exe
文件,并单击下一步
,如图所示:
-
- 取消独立JRE的安装,单击
公共JRE前的下拉列表
,选择此功能将不可用
如图所示: - 修改安装路径,单击更改,如图所示:
- 如果想要修改路径,例如:将安装路径修改为
D:\develop\Java\jdk1.8.0_202\
,并单击确定,如图所示: - 单击下一步,如图所示:
3、配置环境变量
为什么配置path?
希望在命令行使用javac.exe等工具时,任意目录下都可以找到这个工具所在的目录。
我们不可能每次使用java.exe,javac.exe等工具的时候都进入到JDK的安装目录下,太麻烦了。我们希望在任意目录下都可以使用JDK的bin目录的开发工具,因此我们需要告诉操作系统去哪里找这些开发工具,这就需要配置path环境变量。
配置 JAVA_HOME+Path
-
步骤:
-
打开桌面上的计算机,进入后在左侧找到
计算机
,单击鼠标右键
,选择属性
,如图所示: -
选择
高级系统设置
,如图所示: -
在
高级
选项卡,单击环境变量
,如图所示: -
在
系统变量
中,单击新建
,创建新的环境变量,如图所示: -
变量名输入
JAVA_HOME
,变量值输入安装路径 例如:C:\Program Files\Java\jdk1.8.0_202,并单击
确定
-
-
变量值后面:将JDK的安装路径复制过来,不带bin目录
-
选中
Path
环境变量,双击
或者点击编辑
,如图所示: -
点击新建,键入
%JAVA_HOME%\bin
,最后点击确定 。如图所示: -
环境变量配置完成,重新开启DOS命令行,在任意目录下输入
java -version
命令,运行成功。
-
1.5 HelloWorld
1.5.1 开发三步骤
1、程序开发步骤说明
JDK安装完毕,可以开发我们第一个Java程序了。
Java程序开发三步骤:编写、编译、运行。
2、编写Java源程序保存.java源文件
-
在电脑中目录新建文本文件,完整的文件名修改为
HelloWorld.java
,其中文件名为HelloWorld
,后缀名必须为.java。 -
用vscode文本编辑器打开(虽然是记事本也可以,但是不够没有关键字颜色标识,不利于初学者学习)
-
在文件中输入如下代码,并且保存:
public class HelloWorld { public static void main(String[] args) { System.out.println("HelloWorld"); } }
友情提示:
每个字母和符号必须与示例代码一模一样。
第一个HelloWord
源程序就编写完成了,但是这个文件是程序员编写的,JVM是看不懂的,也就不能运行,因此我们必须将编写好的Java源文件
编译成JVM可以看懂的字节码文件
,也就是.class文件。
3、编译Java源文件生成.class字节码文件
在DOS命令行中,进入 目录,使用javac
命令进行编译。
方式一:使用文件资源管理器打开目录,然后在地址栏输入cmd。
方式二:在vscode软件的文件菜单-->在集中终端中打开-->命令行
命令:
javac Java源文件名.后缀名
举例:
javac HelloWorld.java
编译成功后,命令行没有任何提示。打开D:\atguigu\javaee\JavaSE20190624\code\day01_code
目录,发现产生了一个新的文件 HelloWorld.class
,该文件就是编译后的文件,是Java的可运行文件,称为字节码文件,有了字节码文件,就可以运行程序了。
Java源文件的编译工具
javac.exe
4、运行Java程序
在DOS命令行中,在字节码文件目录下,使用java
命令进行运行。
命令:
java 主类名(不要带后缀名了)
主类是指包含main方法的类,main方法是Java程序的入口:
public static void main(String[] args){ }
举例:
java HelloWorld
友情提示:
java HelloWord 不要写 不要写 不要写 .class
Java字节码文件的运行工具:java.exe
1.5.2 常见错误
1、书写错误
-
单词拼写问题
-
正确:class 错误:Class
-
正确:String 错误:string
-
正确:System 错误:system
-
正确:main 错误:mian
-
-
Java语言是一门严格区分大小写的语言
-
标点符号使用问题
-
不能用中文符号,英文半角的标点符号(正确)
-
括号问题,成对出现。
-
2、Java程序的结构与格式
结构:
类{ 方法{ 语句; } }
格式:
(1)每一级缩进一个Tab键
(2){}的左半部分在行尾,右半部分单独一行,与和它成对的"{"的行首对齐
3、字符编码问题
当cmd命令行窗口的字符编码与.java源文件的字符编码不一致,如何解决?
解决方案一:
在vscode编辑器中,修改源文件的字符编码
解决方案二:
在使用javac命令式,可以指定源文件的字符编码
javac -encoding utf-8 HelloWorld.java
4、大小写问题
(1)源文件名:
在Windows操作系统中.java的源文件名不区分大小写,我们建议大家养成区分大小写的习惯。
(2)字节码文件名与类名
严格区分大小写
(3)代码中
严格区分大小写
5、源文件名与类名一致问题?
(1)源文件名是否必须与类名一致?public呢?
如果这个类不是public,那么源文件名可以和类名不一致。但是不便于代码维护。 如果这个类是public,那么要求源文件名必须与类名一致。否则编译报错。 我们建议大家,不管是否是public,都与源文件名保持一致,而且一个源文件尽量只写一个类,目的是为了好维护。
(2)一个源文件中是否可以有多个类?public呢?
一个源文件中可以有多个类,编译后会生成多个.class字节码文件。 但是一个源文件只能有一个public的类。
(3)main方法必须在public的类中吗?
不是。 但是后面写代码时,基本上main方法(主方法)习惯上都在public类中。
注意事项: 1.类名要和java文件名保持一致 2.程序中的标点符号必须是英文的 3.不要将main写成mian 4.System和String的首字母s要大写 5.每个单词写完来个空格增强代码的可读性 6.括号要一对一对的写 7.代码写完语句用;代表结束了,一句话来个分号,证明这是一个单独的语句
第2章 Java基础语法
2.1 注释
-
注释:就是对代码的解释和说明。其目的是让人们能够更加轻松地了解代码。为代码添加注释,是十分必须要的,它不影响程序的编译和运行。
-
Java中有
单行注释
、多行注释
和文档注释
-
单行注释以
//
开头,以换行
结束,格式如下:// 注释内容
-
多行注释以
/*
开头,以*/
结束,格式如下:/* 注释内容 */
-
文档注释以
/**
开头,以*/
结束,Java特有的注释,结合/** 注释内容 */
-
//单行注释 /* 多行注释 */ /** 文档注释演示 @author XXX */ public class Comments{ /** Java程序的入口 @param String[] args main方法的命令参数 */ public static void main(String[] args){ System.out.println("hello"); } }
常见的几个注释:
-
@author 标明开发该类模块的作者,多个作者之间使用,分割
-
@version 标明该类模块的版本
-
@see 参考转向,也就是相关主题
-
@since 从哪个版本开始增加的
-
@param 对方法中某参数的说明,如果没有参数就不能写(后面再学)
-
@return 对方法返回值的说明,如果方法的返回值类型是void就不能写(后面再学)
-
@throws/@exception 对方法可能抛出的异常进行说明 ,如果方法没有用throws显式抛出的异常就不能写(后面再学)
使用javadoc工具可以基于文档注释生成API文档。
用法: javadoc [options] [packagenames] [sourcefiles] [@files]
例如:
javadoc -author -d doc HelloWorld.java
2.2 关键字
关键字:是指在程序中,Java已经定义好的单词,具有特殊含义。
-
HelloWorld案例中,出现的关键字有
public
、class
、static
、void
等,这些单词已经被Java定义好 -
关键字的特点:全部都是
小写字母
。 -
关键字比较多,不需要死记硬背,学到哪里记到哪里即可。
关键字一共50个,其中const和goto是保留字。
true,false,null看起来像关键字,但从技术角度,它们是特殊的布尔值和空值。
2.3 标识符
简单的说,凡是程序员自己命名的部分都可以称为标识符。
即给类、变量、方法、包等命名的字符序列,称为标识符。
1、标识符的命名规则(必须遵守的硬性规则)
(1)Java的标识符只能使用26个英文字母大小写,0-9的数字,下划线_,美元符号$
(2)不能使用Java的关键字(包含保留字)和特殊值
(3)数字不能开头
(4)不能包含空格
(5)严格区分大小写
2、标识符的命名规范(建议遵守的软性规则,否则容易被鄙视和淘汰)
(1)见名知意
(2)类名、接口名等:每个单词的首字母都大写(大驼峰式),形式:XxxYyyZzz,
例如:HelloWorld,String,System等
(3)变量、方法名等:从第二个单词开始首字母大写,其余字母小写(小驼峰式),形式:xxxYyyZzz,
例如:age,name,bookName,main
(4)包名等:每一个单词都小写,单词之间使用点.分割,形式:xxx.yyy.zzz,
例如:java.lang
(5)常量名等:每一个单词都大写,单词之间使用下划线_分割,形式:XXX_YYY_ZZZ,
例如:MAX_VALUE,PI
更多细节详见《Java开发手册(泰山版)》
2.4 初识数据类型
2.4.1 Java的数据类型分为两大类:
-
基本数据类型:包括
整数
、浮点数
、字符
、布尔
。 -
引用数据类型(复杂数据类型):包括
数组
、类
、接口
等。
上图说明:
1.java数据类型分为两大类基本数据类型和引用类型 2.基本数据类型有8种:byte , short , int , long , float ,double , boolean, char 3.引用类型:类,接口,数组
2.4.2 Java的基本数据类型的存储范围(掌握)
float:单精度浮点型,占内存:4个字节,精度:科学记数法的小数点后6~7位
double:双精度浮点型,占内存:8个字节,精度:科学记数法的小数点后15~16位值
2.5 常量
-
常量值:在程序执行的过程中,其值不可以发生改变
-
常量值的分类:
类型 举例 整数常量值 12,-23, 1567844444557L 浮点常量值 12.34F,12.34 字符常量值 ‘a’,'0',‘好’ 布尔常量值 true,false 字符串常量值 ”HelloWorld“
-
整数常量值,超过int范围的必须加L或l(小写l)
-
小数常量值,无论多少,不加F,就是double类型。要表示float类型,必须加F或f
-
char常量值,必须使用单引号
-
String字符串常量值,必须使用双引号
/* 常量值: 代码里面写死的,固定不变的。 一目了然的值。 整数常量值:1 或 1L 小数常量值:1.5 或 1.5F 单字符常量值:'a' 布尔型常量值:true,false 字符串常量值:"hello" */ public class ConstantValue{ public static void main(String[] args){ System.out.println(1);//识别为int System.out.println(1L);//识别为long,数字后面加L或l System.out.println(1.5);//识别为double System.out.println(1.5F);//识别为float类型,数字后面加F或f System.out.println('a');//识别为char类型,单引号 System.out.println(true);//识别为boolean类型 System.out.println(false);//识别为boolean类型 System.out.println("helloworld");//识别为String类型,双引号 System.out.println("1");//识别为String类型,双引号 } }
2.6 变量
2.6.1 变量的概念
变量:在程序执行的过程中,其值可以发生改变的量
变量的作用:用来存储数据,代表内存的一块存储区域,这块内存中的值是可以改变的。
2.6.2 变量的声明
数据类型 变量名; 例如: //存储一个整数类型的年龄 int age; //存储一个小数类型的体重 double weight; //存储一个单字符类型的性别 char gender; '男'/'女' //存储一个布尔类型的婚姻状态 boolean marry; //存储一个字符串类型的姓名 String name; //声明多个同类型的变量 int a,b,c; //表示a,b,c三个变量都是int类型。
注意:变量的数据类型可以是基本数据类型,也可以是引用数据类型。
2.6.3 变量的赋值
给变量赋值,就是把“值”存到该变量代表的内存空间中。
1、变量赋值的语法格式
变量名 = 值;
-
给变量赋值,变量名必须在=左边,值必须在=右边
-
给变量赋的值类型必须与变量声明的类型一致或兼容(<=)
2、可以使用合适类型的常量值给变量赋值
int age = 40; double weight = 126.4; char gender = '女'; boolean marry = true; String name = "好谷";
long类型:如果赋值的常量整数超过int范围,那么需要在数字后面加L/l。
float类型:如果赋值为常量小数,那么需要在小数后面加F/f。
char类型:使用单引号''
String类型:使用双引号""
3、可以使用其他变量或者表达式给变量赋值
int m = 1; int n = m; int x = 1; int y = 2; int z = 2 * x + y;
2.6.4 变量值的输出
//输出变量的值 System.out.println(age); //输出变量的值 System.out.println("年龄:" + age); System.out.println("age:" + age); System.out.println("name" + name + ",age = " + age + ",gender = " + gender + ",weight = " + weight + ",marry = " + marry);
如果()中有多项内容,那么必须使用 + 连接起来
如果某些内容想要原样输出,就用""引起来,而要输出变量中的内容,则不要把变量名用""引起来
2.6.5 变量可以反复赋值
-
变量的第一次赋值称为初始化;
-
变量的再赋值称为修改变量的值;
//先声明,后初始化 char gender; gender = '女'; //声明的同时初始化 int age = 18; System.out.println("age = " + age);///age = 18 //给变量重新赋值,修改age变量的值 age = 19; System.out.println("age = " + age);//age = 19
2.6.6 变量的三要素
1、数据类型
-
变量的数据类型决定了在内存中开辟多大空间
-
变量的数据类型也决定了该变量可以存什么值
2、变量名
-
见名知意非常重要
-
给这块内存区域赋值,例如:我们现在在”XX科技园“,我们住的校区叫做”新芒果春天“
3、值
-
基本数据类型的变量:存储数据值
-
引用数据类型的变量:存储地址值,即对象的首地址。例如:String类型的变量存储的是字符串对象的首地址(关于对象后面章节再详细讲解)
2.6.7 变量的使用应该注意什么?
1、先声明后使用
如果没有声明,会报“找不到符号”错误
2、在使用之前必须初始化
如果没有初始化,会报“未初始化”错误
3、变量有作用域
如果超过作用域,也会报“找不到符号”错误
4、在同一个作用域中不能重名
5、变量值的类型必须与变量声明的类型一致或兼容(<=)
一致:一样 int age = 18; 18是int类型的常量值,age也是int类型 int = int 兼容:可以装的下,=右边的值要 小于等于 =左边的变量类型 long bigNum =18; 18是int类型的常量值,bigNum是long类型 int < long int age = 18L; 错误 18L是long类型的常量值,age是int类型 long > int
2.6.8 练习
public class MyInfo{ public static void main(String[] args){ //存储姓名用String类型 //=左边是变量名,右边是常量值,给变量赋值 String name = "好谷"; System.out.println("name");//原样显示字符串常量值"name" System.out.println(name);//把变量name中的值输出 int age = 40; char gender = '女'; double weight = 148.5; boolean marry = true; System.out.println(age); System.out.println(gender); System.out.println(weight); System.out.println(marry); System.out.println("----------------"); // + 表示拼接,把"姓名:"字符串常量 和name字符串变量的值,拼接起来,构成一个字符串值 System.out.println("姓名:" + name); System.out.println("name=" + name); //System.out.println("姓名:",name);//错误 System.out.println("----------------"); System.out.println("name" + name + ",age = " + age + ",gender = " + gender + ",weight = " + weight + ",marry = " + marry); } }
2.7 最终变量/常量(final)
最终变量习惯上也称为常量,因为它是通过在声明变量的数据类型前面加final的方式实现的,所以叫最终变量。加final修饰后,这个变量的值就不能修改了,一开始赋值多少,就是多少,所以此时的变量名通常称为常量名。常量名通常所有字母都大写,每一个单词之间使用下划线分割,从命名上和变量名区分开来。
这样做的好处,就是可以见名知意,便于维护。
public class FinalVariableDemo { public static void main(String[] args){ //定义常量 final int FULL_MARK = 100;//满分 // FULL_MARK = 150;//错误,final修饰的变量,是常量,不能重新赋值 //输出常量值 System.out.println("满分:" + FULL_MARK); //小好的成绩比满分少1分 int hao = FULL_MARK - 1; //小谷得了满分 int gu = FULL_MARK; //输出变量值 System.out.println("小好成绩:" + hao); System.out.println("小谷成绩:" + gu); } }
2.8 计算机如何存储数据
计算机世界中只有二进制。那么在计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。
2.8.1 进制(了解)
1、进制的分类
(1)十进制: 数字组成:0-9 进位规则:逢十进一
(2)二进制: 数字组成:0-1 进位规则:逢二进一
十进制的256,二进制:100000000,为了缩短二进制的表示,又要贴近二进制,在程序中引入八进制和十六进制
(3)八进制:很少使用 数字组成:0-7 进位规则:逢八进一
(4)十六进制 数字组成:0-9,a-f 进位规则:逢十六进一
2、在代码中如何表示四种进制的常量值
请分别用四种类型的进制来表示10,并输出它的结果:(了解)
(1)十进制:正常表示
System.out.println(10);
(2)二进制:0b或0B开头
System.out.println(0B10);
(3)八进制:0开头
System.out.println(010);
(4)十六进制:0x或0X开头
System.out.println(0X10);
2.8.2 计算机存储单位(掌握)
-
字节(Byte):是计算机信息技术用于计量存储容量的一种计量单位,一字节等于八位。
-
位(bit):是数据存储的最小单位。也就是二进制。二进制数系统中,每个0或1就是一个位,叫做bit(比特),其中8 bit 就称为一个字节(Byte)。
-
转换关系:
-
8 bit = 1 Byte
-
1024 Byte = 1 KB
-
1024 KB = 1 MB
-
1024 MB = 1 GB
-
1024 GB = 1 TB
-