第二周
1.流程控制语句
1.顺序结构语句 :代码由上而下依次加载
2.选择结构语句 :
(1)if语句格式1
if(条件表达式){
语句;
}
执行流程:
1)当前条件表达式成立,执行语句
2)否则不成立,不执行语句;
注意事项:
1)if后面有左大括号的地方不能有分号;有分号;的地方不能有{ 左大括号
2)在方法定义中书写---{} 局部代码块,限定局部变量的生命周期;
它的访问范围就是{}范围内
应用场景:就是针对单个条件进行判断的
(2)if语句格式2:
if(表达式){
语句1;
}else{
语句2;
}
执行流程:
1)判断表达式是否成立,如果成立,执行语句1,
2)如果不成立,执行语句2;
区别:
if...else:
流程控制语句,范围比较广泛,不仅可以操作具体数据值还可以操作输出语句
三元运算符:
是运算符的一种,它只能操作具体的数据结果值,不能直接里面嵌套使用输出语句
三元运算符能够实现的,一定能够使用if...else实现
而if...else...实现的,不一定能够使用三元运算符实现
应用场景:就是针对两种情况进行判断
(3)if语句的格式3:
if(表达式1){
语句1;
}else if(表达式2){
语句2;
}else{
语句n ;
}
执行流程:
1)判断表达式1是否成立,如果成立,则执行语句1;
2)如果不成立,继续判断表达式2是否成立,如果成立,执行语句2;
3)如果表达式2不成立,继续判断表达式3是否成立,如果成立,执行语句3
4)如果上面的条件表达式都不成立,则执行else中的语句n....
应用场景:就是针对多种情况进行判断
(4)switch语句:
switch(表达式){
case 值1:
语句1;
break ;
case 值2:
语句2;
break ;
default:
语句n;
break ;
}
执行流程:
1)判断表达式的值和case值1进行匹配,
如果匹配成功,执行语句1,break结束
2)如果case值1不匹配,继续和case后面的值2进行比较,如果匹配,语句2执行,break结束;
3)如果上面的case的值都和switch中表达式的结果不匹配的,那么最终
就执行default中的语句n,然后程序默认执行到末尾结束了,break结束;
注意事项:
1)switch语句后面的表达式可以是什么样的数据类型
基本的能够使用的数据类型:
byte,short,char,int
JDK5以后,可以跟枚举 (enum)
JDK7以后,可以是String类型
2)case语句后面的值只能是常量
在Java语言中,Java是一个强类型语言:结构和格式是非常严谨的
在Javascript前端语言中,是一个弱类型语言,case后面的值既可以是常量,也能够是变量;
3)case语句中的break 必须带上,否则会造成一个现象:case 穿透
由于某个case已经匹配了,此时如果没有break,那么就继续往下面中
case的语句进行穿透,依次执行,遇见有case中有break的,那么switch结束
4)switch的结束条件
a)语句break结束
b)程序默认执行到末尾
5)default语句可以在语句中的任何位置,不影响程序的执行流程
default的执行,当前case中都没有匹配的话,执行default
3.循环结构语句 :
(1)for循环
格式:
for(初始化语句;条件表达式;控制体语句(步长语句)){
循环体语句;
}
流程:
1)初始化语句进行赋值,只执行一次
2)然后判断条件表达式是否成立
如果成立,执行循环体语句;----然后执行控制体语句(步长语句) (++/--)
3)继续判断条件表达式是否成立,
如果成立,执行循环体语句;----然后执行控制体语句(步长语句) (++/--)
4)执行到条件表达式不成立,for循环语句结束
水仙花数:指的三位数,而且每个位的立方和就是当前数据本身
153 = 3*3*3+5*5*5 + 1*1*1
for循环的嵌套:
for(初始化语句1;条件表达式1;控制体语句1){
循环体是for循环
for(初始化语句2;条件表达式2;控制体语句2){
循环体语句2;....
}
}
(2)while循环格式
格式:
初始化语句;
while(条件表达式){
循环体语句;
控制体语句(步长语句) ;
}
流程:
1)初始化语句进行赋值
2)判断条件表达式是否成立
如果成立,执行循环体语句,控制体语句对变量进行自增或者自减
3)继续判断条件表达式是否成立
4)如果条件表达式不成立,while循环结束
(3)while循环和for循环的区别
共同点:都能够描述循环的思想,将重复度高的代码进行优化,解决冗余度问题
不同点:
1)格式上不同
2)从内角度考虑,for循环使用完毕结束后,那么当前这个变量也就被释放掉了
而while不会,它始终可以访问到这个变量,所以相对来说说,for循环比较节省内存空间
3)释放明确循环次数
明确循环次数:优先采用for循环,其次再是while
不明确循环次数:使用while循环
(4)do-while
格式:
初始化语句;
do{
循环体语句;
控制体语句;
}while(条件表达式) ;
流程:
1)初始化语句执行
2)执行条件表达式,如果条件表达式不成立,循环体至少执行一次
如果条件表达式成立...然后控制体语句,依次判断
do-while循环和其他两个循环的最大的区别:循环体至少执行一次
(5)死循环中常见的两种格式
for(;;){
//业务操作
}
while(true){//恒成立 (使用居多)
//业务操作..
}
实际开发中,需要完成一些业务逻辑操作,
当达到某种条件的时候,结束掉死循环,---使用 break ;(结束,中断)
4.扩展函数
Jdk提供了一个数学运算类java.lang.Math(是一个工具类)
可以针对三角函数,对数,指数等等进行数学运算
提供了一个方法:
public static double random():产生的一个随机数[0.0,1.0)
double result = Math.random() ; //使类名.方法名名() ;
2.跳转控制语句
1.break;
中断,结束的意思
应用场景:
1)不能单独使用,报错
2)只能在两个场景中使用
switch语句自带了break关键字
循环结构语句中
for/while循环都可以用到
break早期的时候,在for循环嵌套中使用,使用"标签语句"
break 标签名称; 结束指定的循环
标签名称:外层循环/内层循环
2.continue:属于跳转控制语句中的一种
一般都在循环语句中使用的;
表示结束当前循环,立即进入下一次循环了...
3.return :返回结果 (结束方法去使用,但是很少单独使用)
一般情况:return不会单独使用(很少单独使用)
结合 Java中的有具体返回值类型的方法去使用
实际开发中,
只要看到return 关键字,肯定是当前方法中有具体返回值类型的时候去使用
3.方法
1.定义
在Java中,
方法就是使用{}代码块将一些业务代码包裹起来,并为之起名字,称为"方法名"
方法名,需要见名知意,满足"标识符的规则",
以后直接在main中调用我们自己的业务方法即可
有具体返回值方法本身定义
权限修饰符 静态修饰符 具体的返回值类型 方法名(形式参数列表){
//方法的业务逻辑
return 结果;
}
没有具体返回值类型的方法的定义格式
权限修饰符 静态修饰符 void 方法名(形式参数列表){
//里面业务逻辑
要么输出/类似于数组中(数据进行互换:排序)
但是不能有return (必须和有具体返回值类型的方法一块使用)
}
2.详细解释:
权限修饰符:现在固定使用public :访问权限足够大的
现在写方法:必须带上static 前面的写法:public static
返回值类型:就是数据类型----研究的就是基本数据类型
法名: 给{}代码块起名字, 见名知意,遵循"标识符规则",小驼峰命名法
add(),求和
sum() ,求和
参数列表:
参数类型 ----:数据类型,现在使用的就是基本数据类型
量名 ---- :给当前形式参数起名字,见名知意,"小驼峰命名法"
return 结果: 根据你的业务方法,
返回值类型时什么类型,给你返回具体的结果
3.调用方法:
1)输出调用:不推荐
2)赋值调用:推荐
调用有具体返回值类型的方法
方法名 ( 参数 ) ;
数据类型 变量名 = 方法名 ( 参数 ) ;
3)单独调用:用不了
4.注意事项:
1)方法和方法是平级关系,不能嵌套,只能在里面去调用
2)定义方法的时候需要两个明确
a)明确返回值类型
b)明确参数类型以及参数个数(形式参数类型和几个参数)
3)在定义方法的时候,形式参数必须携带数据类型,因为Java是一个强类型语言
4)在实际参数 main中,调用方法的时候,实际参数不需要携带数据类型,因为已经键盘录入,已经定义过了
5)实际参数和形参参数,传参时,数据类型需要一一对应
4.数组
1.定义:
数组就是能够存储同一种数据类型的容器,必须满足里面的元素是同一种类型的元素
举例:
存储的int类型,那么就不能出现其他数据类型的元素,否则编译报错
2.数组的定义 格式
1)数据类型[] 数组名称; (推荐第一种方式)
2)数据类型 数组名称[] ;
数组本身就属于引用数据类型,里面存储的元素内容,可以是同一种类型的基本类型元素或者同一类型的引用类型
举例
int[] arr ; //定义了一个int类型的数组,arr变量
int arr[] ;//定义了int类型的arr数组
3.数组的初始化
(1)动态初始化
我们给定数组的长度,数组的元素内容由系统默认初始化
默认初始化:系统给定的
根据我们数组中存储的数据类型来判定
举例:int类型的默认值就是0
double的默认值0.0
...
格式:
数据类型[] 数组名称 = new 数据类型[数组长度] ; (推荐第一种)
数据类型 数组名称[] = new 数据类型[数组长度] ;
[I@6d06d69c 看成arr空间地址值
[:一维数组
@:地址值标记 @
6d06d69c:十六进制数据
(2)静态初始化
我们给定元素的内容,由系统来默认分配长度
格式:
(推荐)数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,元素3....} ;
数据类型 数组名称[] = new 数据类型[]{元素1,元素2,元素3....} ;
简化格式:推荐使用简写格式
数据类型[] 数组名称 = {元素1,元素2,元素3....} ;
数据类型 数组名称[] = {元素1,元素2,元素3....} ;
注意: 创建数组的时候,不能既动态初始化了,还静态初始化了(动静结合:不行)
数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,元素3....} ;
int[] arr = new int[3]{1,2,3} ; 错误
4.数组中常见的异常:
运行时期异常
1)数组角标越界异常---程序运行的时候出现异常
ArrayIndeexOutOfBoundsException 类名
出现这个异常原因:我们访问了数组中不存在的索引值报错
解决方案:
改变索引值
2)实际开发中,经常会出现 空指针异常 NullPointerException
就是当前 我们在访问某个对象的时候,对象已经是null
然后还要使用对象中的某个功能---出现空指针了
解决方案:
对当前这个对象进行非空判断
5.冒泡排序
思想:两两比较,将较大的值往后方法,第一次比较完毕之后,最大值出现在最大索引处,依次这样比较
规律:
两两比较,大的往后放
第一次比较,有0个不比
第二次比较,有1个不比..
比较的次数:数组长度-1次
5.方法重载(OverLoad)
1.概念
当方法的功能都是相同的,我们可以定义同名的方法
参数列表不同,跟返回值无关,可以提高这个功能的扩展性
2.定义:
方法重载: 为了提供某个功能的扩展性
方法名相同,参数列表不同,与返回值无关
参数列表不同:
1)参数个数不同
2)参数类型不同
3)考虑参数类型的顺序