一、Java快速入门、基础语法
1.Java是什么
-
Java是一门高级计算机语言
-
Java的应用场景
-
企业级应用开发
-
-
Java的体系
-
Java SE(Java Standard Edition):标准版
-
Java EE (Java Enterprise Editon):企业版
-
Java ME(java Micro Editon):小型版
-
2.Java开发环境搭建
-
JDK
-
JDK(Java Development Kit,Java开发者工具包)是Java语言的产品,必须先安装JDK才能使用Java。
-
JDK8、JDK11、JDK17、JDK21是长期支持的。
-
-
环境变量的作用
-
Path环境变量:方便在命令行窗口的任意目录启动程序。
-
3.Java入门程序—Hello World
-
Java开发三步骤
-
编写代码
-
代码名必须与类名保持一致
-
-
编译代码
-
javac 文件名.java
-
-
运行代码
-
java 类名
-
-
4.注释
注释是程序中的对代码进行解释说明的文字,这些文字不属于代码,编译成字节码文件时会被编译器忽略
-
程序中有三种写法
-
单行注释://(在光标所在行的任意位置按:Ctrl+/)
-
多行注释:/* */ 也叫块注释(先全部选中需要注释掉的代码,再按:Ctrl+Shift+/)
-
文档注释:/** */用于类或者方法上边
-
5.变量
-
变量是内存中的一块有名字的空间,用来存储一个固定类型的可以变化的数据。
-
声明变量的语法:数据类型 变量名 = 值;
-
int age = 18;
-
int:指定变量中只能存储什么类型的数据,例如:int表示只能存储整数类型、double表示只能存储小数类型
-
age:给变量起的名字,建议首字母小写,有意义
-
=:赋值运算符,表示把等号右边的赋值给等号左边的变量,让变量记住右边的值
-
18:一个整数,在程序中可以交给一个变量来记录它
-
-
-
变量的使用和特点
-
直接通过变量名使用变量,变量的使用只有两个操作:取值和赋值
-
-
注意事项:
-
一个变量中只能存储一个值
-
变量一旦定义好了,类型就确定了,不能存储其他类型的数据
-
定义变量的时候可以不赋初始值,但是使用变量前必须完成对变量的赋值
-
变量的有效范围是从定义开始到距离定义位置最近的 “{” 对应的 “}” 截止
-
同一个范围内,不能定义多个同名变量
-
变量里的数据在计算机中的存储原理
-
变量里的数据是以字节的形式存储在内存中的
-
字节(byte,简称B)是数据在计算机中的最小储存单元,一个字节占8个比特位(bit,简称b),因此1B=8b
-
每个比特位中只能填写一个0或者1的数字,用来表示数据的大小,这种只有0和1两个数字表示数据的方式叫二进制。
-
-
计算机中的数据单位
-
计算机数据单位的最小保存到位是:字节,1B=8b。
-
为了方便识别文件的大小,在B的基础上,计算机发展出了KB、MB、GB、TB、……这些数据单位。
-
6.关键字、保留字
-
关键字是Java中有特殊含义的英语单词,同时也是Java语法中的一部分
-
Java中一共提供了50个关键字:
abstract catch do finally import new short this volatile assert char double float instanceof package static throw while boolean class else for int private strictfp throws break conse enum goto interface protected super transient byte continue extends if long public switch try case default final implements native return synchronized void -
除了这些关键字,还有3个保留字:true,false,null,这三个保留字不是关键字。
-
保留字是Java保留的一些的英语单词,也是Java语言语法本身使用的。
-
关键字一定是保留字,保留字不一定是关键字。
-
所有的保留字都是由小写字母组成的,同时在IDEA中都有特殊颜色标记,但不是所有有颜色标记的都是保留字
7.标识符
-
标识符就是咱们程序中为类、方法、变量等起的名字,用来标识不同的类、方法和变量。
-
标识符必须遵循以下原则:
-
只能由字母、数字、下划线_、美元符号$组成
-
不能以数字开头
-
不能使用关键字和保留字
-
区分大小写
-
-
标识符使用规范
-
建议不用下划线和美元符号开头或者结尾
-
变量命名建议:全英文、有意义、首字母小写,如果有多个单词,满足驼峰命名法,如:age,updateTime
-
类命名建议:全英文、有意义、首字母大写,如果有多个单词,满足驼峰命名法,如:Student,HelloWorld
-
二、Java基础语句
1.数据类型
-
数据类型分为两类:
-
基本数据类型(四类八种)
-
整数(数值类型):
-
byte:字节数:1,数值范围:-128~127
-
short:字节数:2,数值范围:-32768~32767
-
int(默认):字节数:4 数值范围:-2147483648~2147483647(10位数,大概21亿多)
-
long:字节数:8 数值范围:-9223372036854775808~9223372036854775807(19位数)
随便写一个整数,默认会被当成int类型,如果想当成long类型,在后边加"L"
-
-
浮点数(数值类型):
-
float: 字节数:4 数值范围:1.401298 E-45到3.4028235 E+38
随便写一个小数,默认会被当成double类型,如果想当成float类型,在后边加"f"
-
double(默认):字节数:8 数值范围:4.9000000 E-324到1.797693 E +308
-
-
字符型(数值类型):
-
char:字节数:2 数值范围:0-65535
-
-
布尔型:
-
boolean:字节数:1 数值范围:true,fals
-
-
-
-
引用数据类型
-
例如String字符串等类型
-
2.类型转换
-
数值类型的自动类型转换(类型范围小的变量 → 类型范围大的变量)
-
类型转换
-
开发中经常遇到将一种类型的变量的赋值给另外一种类型变量的情况,在这些情况下就需要用到类型转换了。
-
-
自动类型转换
-
类型范围小的变量,可以直接赋值给类型范围大的变量。
例如:byte类型的变量可以直接赋值给int类型的变量:
byte a = 10;
int b = a;
-
-
数值类型范围从小到大
-
-
表达式中的自动类型提升
-
表达式
-
是由运算符链接变量或者数组组成的式子
例如: a + b; a/2;
-
-
表达式中的自动类型提升
-
在表达式中,类型范围小的变量,在参与运算前,会先提升成表达式中较大的数据类型,再参与运算
-
-
表达式的自动类型提升规则
-
规则1:byte/short/char都是先提升为int,再运算
-
规则2:表达式的结果类型由表达式中的最高类型决定
-
-
快速判断表达式结果类型小妙招
-
只要表达式中出现了double类型,结果一定是double。
-
如果表达式中没有double类型,有float类型,结果一定是float类型。
-
如果表达式中没有double类型,也没有float类型,但是有long类型,结果一定是long类型。
-
否则结果一定是int类型。
-
-
-
数值类型的强制类型转换(类型范围大的变量 → 类型范围小的变量)
-
如果要将类型范围大的变量或者数据赋值给类型范围小的变量,必须进行强制类型转换。
-
强制类型转换的语法
-
目标类型 变量名 = (目标类型)数据/变量
浮点型强转成整型的规则:直接丢掉小数点后面的部分,只保留整数部分
-
强制类型转换的内存原理
-
注意事项:
强制类型转换可能会造成数据的损失
浮点型强转成整型的规则是:直接丢掉小数点后边的部分,只保留整数部分
-
-
3.运算符
-
基本运算符
“+”,“-”,“*”,“/”,“%”
在Java中两个整数相除结果还是整数,小数部分会被舍弃
-
+符号的特殊用法
-
+符号的左右两边只要有任意一边出现了字符串,那么+符号就变成了字符串链接符
-
-
计算公式总结:
-
个位:数值%10
-
十位:数值/10%10
-
百位:数值/100%10
-
千位:数值/1000%10
-
-
-
自增自减运算符
-
++:自增
-
--:自减
-
++--放到变量前后的区别
原则:先看到谁,就先执行谁
-
++--出现在变量后(先看到变量),先使用变量,再对变量里的值自增自减
-
++--出现在变量前(先看到++--),先对变量里的值自增自减,再使用变量
-
-
不论++--放在变量前还是变量后,变量里的值都完成了自增自减,只是最终参与运算的变量值会有区别
-
赋值运算符
符号 作用 说明 = 赋值 int a=10; 将等号后边的10赋值给等号左边的变量a += 加后赋值 a+=b; 等价于a=(a的类型)(a+b); 将a+b的值强转成a的类型后赋值给左边的变量a,实现数据的累加 -= 减后赋值 a-=b; 等价于a=(a的类型)(a-b); 将a-b的值强转成a的类型后赋值给等号左边a的变量 *= 乘后赋值 a*=b; 等价于a=(a的类型)(a*b); 将a*b的值强转成a的类型后赋值给等号左边a的变量 /= 除后赋值 a/=b; 等价于a=(a的类型)(a/b); 将a/b的值强转成a的类型后赋值给等号左边a的变量 %= 取余后赋值 a%=b; 等价于a=(a的类型)(a%b); 将a%b的值强转成a的类型后赋值给等号左边a的变量 +=符号的特殊用法
例:i+=i;
将等号右边的值累加到等号左边的变量中,实现数据的累加操作
如果任意一边出现了字符串,将两边的内容拼接到一起,实现字符串的拼接操作
-
关系运算符
符号 例子 作用 说明 > a>b 判断a是否大于b 成立返回true、不成立返回false >= a>=b 判断a是否大于或等于b 成立返回true、不成立返回false < a<b 判断a是否小于b 成立返回true、不成立返回false <= a<=b 判断a是否小于等于b 成立返回true、不成立返回false == a==b 判断a是否等于b 成立返回true、不成立返回false != a!=b 判断a是否不等于b 成立返回true、不成立返回false 关系运算符的作用:判断两个数据的大小关系或者相等关系
关系运算符的结果一定是一个boolean值,即true、false
相等判断一定要写两个等号,一个等号是赋值运算符
关系运算符通常在条件判断中
-
逻辑运算符
逻辑运算符是进行逻辑运算的符号,只有布尔值(true/false)能进行逻辑运算,逻辑运算的结果还是一个布尔值
符号 名称 例子 运算逻辑 && 逻辑与 2>1&&2>3 左右两边都是true,结果才是true || 逻辑或 2>1||2>3 左右两边只要有一边是true,结果就是true ! 逻辑非 !(2>1) 取反,对true取反的结果是false,对false取反的结果是true ^ 逻辑异或 2>1^2>3 相异为真,相同为假,例如:true^true=flase
三、方法
1.方法概述和方法定义
方法是类中的第二大成分,一个方法就是一个独立的功能,是具体用来处理对象中的数据。
修饰符 返回值类型 方法名 (参数列表)
方法体代码
具体语法如下:
public double getSum(doubule chinese,double math){
double sum=chinese+math;
return sum;
}
方法调用
-
方法必须被对象调用才能执行起来,方法调用格式是:
方法定义和调用时的注意事项
-
定义方法时,参数列表中可以有任意多个参数,多个参数间用英文逗号隔开
-
如果方法中声明了返回值类型,那么方法必须使用return返回对应类型的数据
-
return语句的作用是返回方法调用处,因此,return语句后边不能再写代码了,因为无法执行到
-
对象调用方法时,一定要按照方法形参列表中参数的类型、顺序、个数给方法传递参数
-
如果对象调用的方法声明了返回值类型,那么调用方法时,要使用同类型的变量接受方法返回的数据
-
2.没有参数的方法和没有返回值的方法
-
没有参数的方法
-
如果方法不需要接受数据就能执行,那么方法的参数列表空着不写,注意小括号不能省略
-
-
没有返回值的方法
-
如果方法执行完没有数据需要返回,那么定义方法时返回值类型写void,此时方法内部不能使用return返回数
-
四、String类
1.String类概述和对象的创建
-
String是Java提供的一个用来记录和处理字符串数据的类。
-
创建String类的对象
-
创建String类对象的方式和创建咱们自己定义的类的对象是一样的:
写法 作用 简化写法 String s=new String(); 创建一个空字符串 String s=""; String s=new String("你好"): 创建一个内容是"你好"的字符串 String s="你好"; 将来,咱们创建字符串对象的时候尽量采用简化写法
-
-
创建空字符串:String str="";
-
创建有内容的字符串:String str="你好";
2.String类常用方法
-
String的常用方法(一)
方法签名 说明 public int length() 返回字符串的长度 public char charAt(int index) 返回指定索引位置的字符 public boolean equals(Object anObject) 比较字符串和参数中的字符串的内容是否相同 public boolean equalslgnoreCase(String anotherString) 忽略大小写比较字符串的内容是否相同 public boolean contains(CharSequence s) 判断字符串中是否包含参数中的字符串 public boolean startsWith(String prefix) 判断字符串是否以指定的前缀开头 字符串中的索引是从0开始编号的,字符串的最大索引是*.length()-1
-
String的常用方法(二)
方法签名 说明 public String toUpperCase() 将字符串中的所有字母转换成大写 public String toLowerCase() 将字符串中的所有字母转换成小写 public String replace(CharSequence target,Char Sequence replacement) 将字符串中所有等于第一个参数的内容全部替换成第二个参数的内容 -
字符串的不可变性
字符串的对象一旦被创建出来,不能被修改,这种特性叫做不可变性,每一次调用修改字符串的方法,实际上都产生了一个新的字符串对象,原来的字符串对象没有发生变化。
-
-
String的常用方法(三)
方法签名 说明 public String substring(int beginIndex,int endIndex) 返回从开始索引截取到结束索引的字符串(包前不包后) public String substring(int beginIndex) 返回从开始索引截取到末尾的字符串 -
方法重载
-
如果在同一个类中,出现了多种方法名称都相同,形参列表不同,这些方法就是重载的方法,也称为方法重载
-
形参列表不同指的是:形参的个数、类型、顺序不同,不关心形参的名称。
-
使用方法重载可以让一类相同功能的方法名称保持一致,代码可读性更好,也可以降低使用者的学习成本
-
-
五、分支语句
1.单路if语句
-
if是如果的意思,在所有的变成语言中,if语句都是用来做条件判断的,如果条件满足,就执行某些功能。
单路if语句的语法
if(条件){
语句体;
}
-
单路if语句的执行流程
-
首先判断小括号中的条件
-
如果条件为true,执行大括号中的语句体
-
语句执行完成后,跳出if分支,继续执行后面的代码
-
如果条件为false,不执行语句体,直接跳出分支,执行后面的代码
return; 用在没有返回值的方法中,作用是立即结束当前方法的执行,回到方法调用处
在执行一段代码前,先判断异常情况,防止出现不必要的异常。
-
2.双路if-else语句
-
if是如果的意思,else是否则的意思,从字面意思上理解就是如果条件满足,执行一段代码,否则执行另一段代码。
-
双路if-else语句的语法:
if(条件){
语句体1;
}else{
语句体2;
}
-
双路if-else语句的执行流程
-
首先判断小括号的条件
-
如果条件为ture,执行条件后面的大括号中的语句体1,执行完跳出分支
-
否则执行else后面的语句体2,执行完跳出分支
-
-
双路if-else的替代写法:三元运算符
-
三元运算符语法:
条件 ? 值1:值2;
-
-
三元运算符的执行流程
-
首先判断问号前面的条件
-
如果条件为true,返回问号后面的值1
-
否则返回冒号后面的值2
-
-
3.多路if-else if-else语句
-
在判断条件较多的时候,使用多路if-else if-else语句可以使代码更简洁
-
多路if-else if-else语句的语法
if(条件1){
语句体1;
}else if(条件2){
语句体2;
}else{
语句体n;
}
-
多路if-else if-else语句的执行流程
-
4.switch语句
-
switch语句是除了if之外的第二大分支语句,它是通过匹配值来决定执行哪条分支的。
-
switch语句的语法
-
小括号中通常都直接写一个变量,也可以是一个表达式。
-
变量或表达式的结果类型只能har/byte/short/int/String/枚举。
-
case后面值的类型必须和变量的类型保持一致。
-
每个case块的代码编写完毕后,一定要记得写一个break;
-
-
switch语句的执行流程
-
先获取到变量或者表达式的值,再拿着这个值与case后面的值进行匹配。
-
表达式的值与哪个case后的值相等,就执行哪个case块的代码。
-
执行代码的过程中遇到了break就跳出switch分支,结束switch语句的执行。
-
如果所有case后面的值都不等于表达式的值,则执行default块的代码。
-
-
switch语句的写法
switch(变量或者表达式){
case 值1:
执行代码1;
break;
case 值2:
执行代码2;
break;…
…
default:
执行代码n;
}
-
-
switch的穿透性
-
switch的穿透性指的是如果某一个case块中的代码执行完成后,没有遇到break,程序会直接进入到下一个case块中执行代码,直到遇到break或者将后面所有的case块以及default中的代码都执行完才会结束switch的执行。
-
当存放多个case分支中的代码都相同时,就可以利用穿透性,将相同的代码统一放到最后一个case块中,一旦匹配到前面case的值,就通过穿透性穿透到后面的case中执行代码,进而达到简化代码的目的。
-
5.if语句和switch语句的使用场景
-
if
-
只要结果是boolean类型即可,可以进行区间判断,相对灵活
-
当需要进行范围判断或者复杂的条件判断时,if语句的表达能力更好。
-
if只能从第一个条件开始逐个判断
-
-
switch
-
只能是规定类型的值,不可以是boolean值
-
当需要对一个变量的不同取值进行判断时,switch语句更加清晰和简洁。
-
switch在编译时会使用跳转表或查找表优化
在分支较多的情况下,switch的执行效率更高且格式更优雅!
-
六、循环结构
1.while循环
while是当的意思,从字面意思上理解就是当条件满足的时候,重复执行一段代码,直到条件不满足
-
while循环语句的写法
初始化语句;
while(条件判断语句){
循环体语句;
条件控制语句;
}
-
while语句的执行流程
-
首先执行一次while循环上方的初始化语句
-
再执行while后边的条件判断语句
-
当条件为true,执行条件后面大括号中的循环体语句和条件控制语句
-
大括号中的内容执行完成后再次执行while后面的条件判断语句
-
2.使用debug跟踪程序的执行流程
debug是集成开发环境(如IDEA)自带的断点调试工具,使用debug可以控制程序从断点位置开始一行一行的执行,然后详细查看代码每一步的执行情况。
-
debug的使用步骤
-
打断点
-
以debug的形式启动程序
-
选择不同的按钮,控制代码一行一行往下执行
-
3.死循环
死循环是循环条件永远满足的循环结构,会一直执行
作用:可以控制一段代码一直重复执行
死循环的标准写法:
while(true){
System.out.println("我爱java");
}
4.for循环
for循环是比while循环更简洁的循环写法。
-
for循环语句的语法
if(初始化语句;条件判断语句;条件控制语句){
循环体语句
}
-
for循环的执行流程
-
for循环的格式是通过while循环改过来的
-
for循环只是写法上和while循环有区别
-
执行流程和while循环是一模一样的
-
5.while循环和for循环的使用场景
-
while循环
-
只要是boolean类型即可,相对灵活
-
-
for循环
-
往往都是基于前面的整形变量,基于次数
如果已知循环次数,建议使用for循环,如果提前不知道循环次数,建议使用while循环。
-
6.跳转关键字break/continue
-
break
-
用在循环中:立即结束所在循环的执行
-
用在switch分支中:立即结束switch分支的执行
-
-
continue
-
只能用在循环中:用于跳出当前循环的当次执行,直接进入循环的下一次执行
-
7.嵌套循环
嵌套循环指的是循环中又出现了循环,外面的一层循环叫外层循环,里面的一层循环叫内层循环。
-
循环嵌套的流程
-
外层循环每执行一次,内层循环执行一轮
-
七、随机数Random类
1.Random类
-
Random类是用来生成一个随机数的类。
2.Random类的用法
-
创建Random类的对象
Random r = new Random();
注意:Random类是Java提供的程序,不是当前包下的类,因此需要导包使用
import java.util.Random;
-
调用nextInt()方法获取随机数
int data = r.nextInt(10);
注意:调用方法返回的data是0-9之间的随机数,不包括边界10
-
使用Random生成任意区间的随机数
-
int data = r.nextInt(区间数字)+初始区间的;(比如66-88)(23)+66;
-
八、键盘录入Scanner类
1.Scanner类
-
Scanner类是JDK提供的一个用来接收键盘录入的类。
2.Scanner类的用法
-
创建Scanner类的对象
Scanner sc=new Scanner(System.in);
注意:Scanner类是Java提供的程序,不是当前包下的类,因此需要导包使用
-
调用方法获取键盘输入的数据
-
在接收键盘输入之前,先打印一个提示信息
-
接收键盘输入的字符串:.next();
-
接收键盘输入的整数:.nextInt();
-
接收键盘输入的小数:.nextDouble();
-
九、内存
1.java程序的执行流程
结论:咱们编写的程序,都是先编译成字节码文件,然后再交给JVM虚拟机执行的!
2.Java的内存分配
-
方法区
-
程序运行时字节码文件进入的区域
-
-
栈内存
-
方法被调用时进入栈内存
-
方法内的局部变量也是在栈内存中的
-
-
堆内存
-
所有new出来的对象都存放在堆内存并对外提供一个地址
-
十、数组
1.数组
-
数组是计算机中最常用的数据结构,他用一段连续的内存空间存储一批同种类的数据。
-
由于数组采用的是连续储存的空间,因此,一旦数组被创建后,这段连续的空间就被锁定了,长度无法改变。
-
数组中的每个数据都有一个成为索引的整数编号,从0开始,以此递增,根据数组名和索引就可以快速定位到数组的某一个元素。
-
2.数组的定义和初始化
-
数组中元素的类型[]数组名 = new 数组中数据的类型[数组中元素的个数];
-
获取数组中元素的个数:数组名.length
-
获取数组中的元素:数组名[0];
-
修改数组中的单个元素:数组名[0]=修改的值;
-
在定义数组的时候指定数组中的所有元素:数组中元`素的类型[]数组名={值1,值2,值3…};
-
3.数组的遍历
-
数组的遍历是将数组中的数据一个一个的取出来,然后进行相应地操作
-
怎样遍历数组
-
普通for循环:(快速写法:数组名.fori)
for(int i= 0;i<数组名.length;i++){
System.out.println(数组名[i]);
}
-
增强for循环:(快速写法:数组名.for)
for(数据类型 变量名:数组名){
System.out.println(变量名);
}
-
-
数组作为方法的参数
public class Student { String name; public void printTotalScore (double [] scores){ double sum = 0; for(int i = 0; i < scores.length; i++){ sum += scores[i]; } System.out.println(name + "总成绩是:" + sum); } }
-
可变参数作为方法的参数
public class Student { String name; public void printTotalScore(double... scores) { double sum = 0; for (int i = 0; i < scores.length; i++){ sum += scores[i]; } System.out.println(name + "的总成绩是:" + sum); } }
4.可变参数
语法:数据类型 ... 参数名
-
在方法内部,可变参数本质上就是一个数组,可以直接当成数组遍历
-
在调用方法的时候,遇到可变参数,也可以直接传递数组
-
可变参数除了可以接收数组,还可以更灵活地接收任意多个变量,甚至可以不传参数
-
注意事项:方法的参数列表中只能出现一个可变参数,且必须放到最后
十一、Lombok类库
Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashCode、toString等方法,提高实体类的编写效率。
-
Lombok的注解
注解 作用 @Data 为所有属性生成get/set方法,同时自动重写toString()方法、hashCode()方法、equals()方法 @NoArgsConstructor 为实体类生成无参数构造器 @AllArgsConstructor 为实体类生成有参数构造器
程序在编译时,会自动在字节码文件中生成对应的get/set/toString()等方法。
在使用lombok时,还需要在当前模块中引入一个lombok相关的依赖,引入方式:官网下载jar包:Download下载后在模块上新建一个目录:lib,将jar包复制到lib目录后,右键选择->Add as Library.