1.Java语言发展史
什么是Java语言
Java语言是美国Sun公司(Stanford University Network),在1995年推出的高级编程语言.所谓编程语言,是计算机的语言,人们可以使用编程语言对计算机下达命令,让计算机完成人们需要的功能.
计算机基础知识
二进制
1.十进制转为二进制数据: 使用除以2的方式获取余数,从下往上依次取值(如: 6`(10)` = 6 / 2 /2 = 110`(2)`)
2.二进制转为十进制数据:
字节
字节是计算机中最小的存储单元.计算机存储任何的数据都是亿字节的形式存储
8 bit = 1 Byte
1024 B = 1 KB
1024 KB = 1 MB
1024 MB = 1 GB
1024 GB = 1 TB
2.Java语言跨平台原理
Java虚拟机–JVM(不同的操作平台有不同的JVM)
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
JRE
Java运行环境(Java Runtime Environment,简称JRE)是一个软件,由太阳微系统所研发,JRE可以让计算机系统运行Java应用程序(Java Application)。
JRE的内部有一个Java虚拟机(Java Virtual Machine,JVM)以及一些标准的类别函数库(Class Library)。
JDK
JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。
JDK组成
JDK包含的基本组件包括:
javac – 编译器,将源程序转成字节码
jar – 打包工具,将相关的类文件打包成一个文件
javadoc – 文档生成器,从源码注释中提取文档
jdb – debugger,查错工具
java – 运行编译后的java程序(.class后缀的)
appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。
Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。
Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。
Jconsole: Java进行系统调试和监控的工具
![jdk](C:\Users\lock\Pictures\jdk.png)
3.JDK的下载和安装
1.进入https://www.oracle.com/
Oracle官网,进入后在最下面有一个叫JAVASE Downloads(点击进去进入选择版本),Oracle JDK下方点击JDK Download,找到对应系统的JDK点击下载
2.进入https://www.oracle.com/cn/index.html中文版页面进行下载
3.安装 : 傻瓜式安装(ps : 注意选择安装位置,最好不要装在C盘)
4.常用的DOS命令
windows + R : 打开运行窗口,键入cmd回车,进入DOS的操作窗口
Table : 自动补全
切换盘符 盘符名称:
进入文件夹 cd 文件夹名称
回到上级 cd ..
从根目录进入目标文件夹 cd \ 文件夹名称 \ .... \ 目标文件夹名称
进入根目录 cd \
显示当前文件夹或盘符内的文件 dir
创建文件夹 mk 创建文件夹名称
清楚屏幕 cls
退出DOS命令窗口 exit
5.Path环境变量的配置
windows + E : 打开此电脑
右键单击此电脑选择属性
点击高级系统设置
系统属性中 --> 高级 --> 启动和故障恢复 --> 点击环境变量
在下放的系统变量 --> 新建
变量名 : JAVA_HOME
变量值 : JDK安装的目录(如 : E:\develop\Java\jdk-12.0.2_windows-x64_bin)
点击确定
在系统变量(变量那一列)中找到PATH,点击编辑 --> 新建 --> %JAVA_HOME%\bin
点击确定
测试 :
打开DOS窗口
输入java或者javac出现提示 :
用法 : ......
安装成功
输入 : java -version查看jdk版本
6.HelloWorld案例
注意 :
在class前面加上public : 类名必须和文件名一致,不然会出错(找不到类)
在class前面不加public : 可以文件名和类名不一致(不推荐使用)
public class HelloWorld
public class HelloWorld {
public static void main(String[] args) {
System.out.println("HelloWorld!");
}
}
编译-执行
打开命令提示符
cd 进入文件所在文件夹
javac 文件名.后缀(编译,编译成功会生成.class文件,也称为字节码文件)
java 文件名(后面什么都不加,直接回车运行)
易错 :
1.文件名和类名不一致
2.大小写错误
3.大括号缺少
4.缺少分号(分号表示一句话结尾)
7.注释
1.单行注释 : //
2.多行注释 : /*.......*/
3.文档注释 : /**.......*/
8.关键字的概念和特征
概念 : 被赋予了特殊含义的,被保密的,不能随意使用的字符
特征 :
1.完全小写的字母(ps: public)
2.在高级记事本中高亮
9.标识符
是指在程序中,自己定义的内容(ps: 如类的名字,方法名)
命名规则 :
1.由数字,字母,下划线,$组成
2.不能以数字开头
3.标识符不能是关键字
4.区分大小写
命名规范 :
1.类名规范: 首字母大写,后面每个单词首字母大写(大驼峰式命名法)
2.变量名和方法名规范: 首字母小写,后面每个单词首字母大写(小驼峰式命名法)
10.常量
概述
常量是指在java程序上运行期间不变的数据.
分类
类型 | 含义 | 示例 |
---|---|---|
整数常量 | 所有的整数 | 0, 1, 345, 9 |
小数常量 | 所有的小数 | 0.0, 1.45, -1.2 |
字符常量 | 单引号引起来,单个字符,必须有内容 | ‘a’ ‘_’ ‘子’ |
字符串常量 | 双引号引起来,多个字符 | “你好世界+123HelloWorld” |
布尔常量 | 只有两个值(true\false) | true false |
空常量 | 只有一个值(null) | null |
11.基本数据类型
数据类型分类
1.基本数据类型: 包括整数,小数(浮点数),字符,布尔
2.引用数据类型: 包括类,数组,接口
基本数据类型
四类八种数据基本类型:
整数: byte, short, int(默认), long
小数: float, double(默认)
字符: char
布尔: boolean
12.变量的概念与定义格式
概念
变量: 在程序运行过程中发生改变的数据,称为变量
定义格式
数据类型 变量名 = 数据;
java中要求一个变量每次只能保存一个数据,必须要有明确保存的数据类型
注意事项
1.如果创建多个变量,那么变量之间的名称不能相同
2.对于float和long类型来说,赋值时将后面的F或L不能丢掉
3.注意定义时的数据类型,右侧赋值时不能超过左边的数据类型的范围
4.没有赋值的变量不能直接使用,必须先赋值在使用
5.变量不能超出作用与的范围
作用域: 从定义变量开始,变量所属的大括号里面就是它的作用范围,超出范围就会报错
13.数据类型转换
隐式转换(自动转换)
将数据范围小的数据转化为数据范围大的数据类型(自动转换)
强制转换
将数据范围大的数据转化为数据类型范围小的类型(可能会出现数据丢失,不推荐使用)
数据类型 变量名 = (目标数据类型)变量
字符转换
1.字符转换对照编码表中对应的数字进行赋值(编码表: ASCII\UniCode)
2.UniCode: 通常用两个字节表示一个字符,将原有的英文编码单字节变成双字节,只需要把高字节全部填为0就可以
3.ASCII: 占用一个字节,一个字节能表示最大的整数就是255(2^8-1=255),而ASCII编码 占用0~127用来表示大小写英文,数字和一些符号
4.int a = (int)'a'; //a = 97
14.算术运算符
算术运算符: + - * / %
1. + :
①对于数值来说,就是加法
②对于字符char类型来说,在计算之前,char会提升为int类型,然后再计算.char字符和int类型的对照关系表: ASCII\UniCode
③对于字符串来说,加号等于连接符,进行字符串的拼接操作
2. - *: 和平常使用的减法,乘法相同
3. /: 取商
4. %: 取余数
自增自减运算符(++ --)
1. 一种是单独使用
int a = 10;
a++;
这种情况下,++a,和a++没有什么区别
2. 混合使用
int a = 1;
System.out.println(++a); //2
System.out.println(a++); //打印2 执行完后a=3
System.out.println(a); //3
这种情况下++a: a先加1在进行打印操作
a++: a先进行打印操作在进行+1
++在前先进性自加在参加操作
++在后先操作后自加
15.赋值运算符
基本赋值运算符
int a = 20;
将等号左边的数据赋值给右边的变量a
复合赋值运算符
+= | a += 3 | a = a + 3; |
-= | a -= 3 | a = a - 3; |
*= | a *= 3 | a = a * 3; |
/= | a /= 3 | a = a / 3; |
%= | a %= 3 | a = a % 3; |
16.比较运算符
比较运算符包括: | |
---|---|
== | 比较符号两边数据是否相等,相等结果是true,不相等的结果是false |
< | 比较符号左边数据是否小于右边数据,相等结果是true,不相等的结果是false |
> | 比较符号右边数据是否大于左边数据,相等结果是true,不相等的结果是false |
<= | 比较符号左边数据是否小于等于右边数据,相等结果是true,不相等的结果是false |
>= | 比较符号左边数据是否大于等于右边数据,相等结果是true,不相等的结果是false |
!= | 不等于符号,如果符号两边的数据不想等,结果为true |
比较运算符: 是两个数据之间进行比较的计算,运算结果为boolean值
17.逻辑运算符
运算符 | 示例 | 特点 |
---|---|---|
&(并且) | 2 > 1 & 0 < -1 | 两边表达式必须都为true |
|(或者) | 1 = 0 | 5 > 3 | 只要有一边的表达式为true |
!(取反) | !1 > -1 | 结果上取反(结果为true则取反为false) |
1.逻辑&和短路&&的差别:
&: 左右两边都执行,左边为false也执行右边
&&: 左边为false时,不执行右边表达式(提高效率)
2.逻辑|和短路||的差别:
|: 左边右边都执行,有表达式条件成立为true
||: 左边为true时,不执行右边,直接进行下一步操作(提高效率,节省性能)
18.三元运算符
数据类型 变量名 = 关系表达式 ? 数据1 : 数据2;
int max = 10 > 20 ? 10 : 20;
如果关系表达式的值成立,将数据1的值返回,不成立则返回数据2
19.方法入门
概述
1.方法就将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能(提高了代码的复用性,解决代码冗余)
2.方法其实就是一个若干语句的功能集合
方法定义格式
1.方法好比就是一个工厂
参数(原料),就是进入方法的数据
返回值(产出物),就是从方法中出来的结果数据(目标数据)
修饰符 返回值类型 方法名 (参数类型 参数名称,....) {
代码....;
返回值;
}
定义格式解释:
1. 修饰符: public static等
2. 返回值类型: 基本数据类型,void,引用数据类型
3. 方法名: 自己起的名字,满足标识符命名规则(建议: 见名知意)
方法的调用
static方法可以直接方法名调用(需要在一个类里面)
不是静态方法,需要new一个对象,通过变量名(对象名称)调用
20.JDK9的JShell简单使用
jshell简介
jshell 是 Java 9 新增的开发工具,可以用于执行 Java 代码并立即获得执行结果。支持定义变量、方法、类等,支持输入语句、表达式,支持导入外部 Java 源文件。按照官方的定义,jshell 里用到的小块 Java 代码被称为“片段”。
jshell简单使用
1. 打开DOS窗口
2. 键入jshell回车
3. 写代码(ps: 输出打印,回车时直接就输出了)
21.流程控制
概述
程序在执行的过程中,语句的执行顺序对程序是有直接影响的,所以我们必须清楚每条语句的执行流程
顺序结构
顺序执行就是根据程序编写的顺序,从上到下一次执行
分支结构
判断语句If
if语句第一种格式:
if(表达式) {
执行体;
}
if语句的第二种格式:
if(表达式) {
执行体;
}else {
执行体;
}
if语句的第三种格式:
if(表达式1) {
执行体1;
}else if(表达式2) {
执行体2;
}.....
}else {
执行体n + 1;
}
选择结构Switch
switch(表达式) {
case 常量值1:
执行语句1;
break;
case 常量值2:
执行语句2:
break;
......
default:
执行语句n + 1;
break;
}
执行流程:
1. 首先计算表达式值
2. 拿计算的值一次和case的常量值匹配,有对应的值就执行case里面的语句体,没有就继续匹配,匹配不到,会执行default里面的语句体
3. 如果有case语句体下面没有写break(跳出循环)关键字,可能会发生穿透
public class Test01 {
public static void main(String[] args) {
int a = 10;
System.out.println("判断是春夏秋冬那个季节");
switch(a) {
case 1:
case 2:
case 12:
System.out.println("冬季");
break;
case 3:
case 4:
case 5:
System.out.println("春季");
break;
case 6:
case 7:
case 8:
System.out.println("夏季");
break;
case 9:
case 10:
case 11:
System.out.println("秋季");
break;
}
}
}
循环结构
概述
循环语句在满足条件时,反复执行一段代码,这段被反复执行的语句体被称为循环体语句,当反复执行这个循环语句体时,需要在合适的时候把判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环
For循环格式
for(初始化表达式; 布尔表达式; 步进表达式){
循环体;
}
While循环格式
while(布尔表达式) {
循环体;
}
标识符:while(布尔表达式) {
循环体;
break 标识符; //直接跳出循环
}
Do…While循环格式
do{
循环体;
}while(布尔表达式);
ps: do...while 最少执行一次
三种循环的区别
1.如果条件判断从来没有满足过,那么for循环和while循环将不会执行,但是do...while循环会执行最少一次(和do...while循环的模式有关,先执行循环体,后判断,所以最少会执行最少一次)
2.for循环的变量在小括号当中定义,只有循环内部才可以使用.while循环和do...while循环初始化语句本来就定义在外面,所以循环之后还可以继续使用
循环使用选择(建议)
1.可以确定循环次数的使用for循环
2.不能明确循环次数的使用while循环
循环控制语句(break;cuntinue;)
1.break可以直接跳出当前循环,一旦执行,整个循环语句立刻结束,终止循环
2.break可以用在switch语句中,一旦执行,整个switch语句立刻结束
3.continue语句,在循环中出现,跳过本次循环,直接开始下一次循环
死循环
永远停不下的循环,叫做死循环
死循环的标准格式:
while(true) {
循环体;
}
for循环中没有步进表达式,初始化和条件判断语句就没有什么意义了
for(;;) {
循环体;
}
循环嵌套
for(初始化变量; 条件表达式; 步进表达式) {
for(初始化变量; 条件表达式; 步进表达式) {
循环体;
}
}
22.项目结构
1.最外层的是项目(Project),项目就是最大的包(ps:淘宝,京东等就是一个项目)
2.项目里面的次级目录就是Module,一个项目中可以有多个Module(ps:淘宝的每日精选,淘金币签到等)
3.在Module中有一个叫src的文件夹,我们所有的代码都写在里面,可以使用包名,将各种功能的类区分开来(包名,就是文件夹,一般使用公司的域名倒写,ps:cn.itcast,不要带www,中间的.是目录层级,cn.itcast指的就是在cn的文件夹中有一个叫itcast的文件夹,这个文件夹中就可以放置自己写的.java文件了)
4.在程序run之后,生成的.class文件在项目所在的目录会生成一个out文件夹,里面会把Module的目录都给复制进去,但是在src文件夹中放置的.java文件会变成.class(.class文件和.java文件分开,可以更好的开发)
23.方法
方法的三种调用格式
1.单独调用: 方法名称(参数);
2.打印调用: System.out.println(方法名称(参数));
3.赋值调用: 数据类型 变量名称 = 方法名称(参数);
4.注意: 使用void修饰的方法只能单独调用,不能打印调用和赋值调用
有参数和无参数
1.有参数: 小括号中有内容,当一个方法需要一些数据条件才能完成任务的时候,就是有参数
2.无参数: 小括号中留空,一个方法不需要任何数据条件,自己就能独立完成任务,就是无参数
方法的注意事项
1.方法只能定义在类中,不能嵌套使用
2.方法定义的前后顺序无所谓
3.方法定义之后不会执行,必须调用该方法(单独调用、打印调用、赋值调用)
4.如果方法有返回值,那么必须写上"return 返回值;",不能没有
5.return后面的返回值必须和方法的返回值类型,对应起来
6.对于一个void没有返回值方法,不能写return后面的返回值,只能写return自己(最后一句return也可以不写)
7.一个方法之中可以有多个return,但是必须保证只有一个return被执行到,两个return不能连写
方法的重写(重载)
正确写法:
1.方法名相同,参数列表不同
2.参数个数不同
3.参数类型不同
4.参数的多类型顺序不同
错误写法:
5.与参数的名称无关
6.与方法的返回值无关
24.数组
概念
1.数组是一种存放相同类型,多个数据的一种容器
数组的特点
1.数组是一种引用数据类型
2.数组当中的多个数据类型必须统一
3.数组的长度在程序运行期间不能被改变
数组初始化
两种常见的初始化方式:
1.动态初始化(指定数组长度)
2.静态初始化(指定数组元素内容)
动态初始化
数据类型[] 数组名 = new 数据类型[数组长度];
1.左侧数据类型,指定数组当中存放的元素都是那种类型
2.左侧中括号,代表数组
3.左侧数组名,给数组取的名字(小驼峰命名法)
4.右侧的new,代表创建数组,在内存里面开辟空间
5.右侧的数据类型,必须和左侧的数据类型一致
6.右侧中括号里面的数组长度,也就是数组可以存放多少个数据,是一个int数字
静态初始化
两种创建方式:
1.完整创建格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2};
2.简化写法:
数据类型[] 数组名 = {元素1,元素2};
注意:
1.元素: 数组当中存放的数据
2.静态初始化创建时根据数组元素个数指定数组长度大小
注意
1.注意: 数组名中存放的是16进制的内存地址值
[@95412c2f :
[ 表示它是一个数组
@ 分隔符
95412c2f 16进制的内存地址值
2.获取数组元素使用索引获取:
索引: 从0开始,代表第一个元素,第二个元素就是索引+1
创建数组时,会给数组分配空间,和索引
获取数组元素: 数组名[索引值];
数组索引越界异常
使用数组中不存在的索引值获取元素时会出现数组索引越界异常
获取数组长度: 数组名.length(会返回一个int数组,代表数组长度)
数组索引 = 数组长度-1
数组空指针异常
数组没有进行new创建,使用时就会出现空指针异常
原因:
1.没有创建数组(new)
解决方案:
1.创建数组new