分支结构----switch语句
`switch(表达式){`
case 1:
语句体1;
break;
case 2:
语句体2;
break;
...
default:
语句体n+1;
break;
`}`
执行流程
- 首先计算出表达式的值
- 其次,和case一次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。
- 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束。
**注意:**如果switch中得case,没有对应break的话,则会出现case穿透的现象
case判断都支持哪些类型
- 基本数据类型:byte,short,char,int
- 字符串类型: String(Jdk 7+ 开始支持)包装数据类型:
- 包装数据类型: Byte,Short,Character,Integer
- 枚举类型:Enum
switch语句case穿透
**概述:**如果switch语句中,case省略了break语句,就会开始case穿透
**需求:**键盘录入星期数,输出工作日、休息日(1-5)工作日,(6-7)休息日
循环结构
for循环结构
循环:
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复 执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。
格式:
for(初始化语句;条件判断语句;条件控制语包){
循环体语句;
}
格式解释:
- 初始化语句: 用于表示循环开启时的起始状态简单说就是循环开始的时候什么样
- 条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行下去
- 循环体语句: 用于表示循环反复执行的内容,简单说就是循环反复执行的事情
- 条件控制语句:用于表示循环执行中每次变化的内容,简单说就是控制循环是否能执行下
执行流程:
- 执行初始化语句
- 执行条件判断语句,看其结果是true还是false
如果是false,循环结束;如果是true,继续执行
- 执行循环体语句
- 执行条件控制语句
- 回到‘2’继续
while循环
while结构
while循环完整格式:
初始化语句;
while (条件判断语句){
循环体语句;
条件控制语句;
}
while循环执行流程:
-
执行初始化语句
-
执行条件判断语句,看其结果是true还是false
如果是false,循环结束如果是true,继续执行
-
执行循环体语句
-
执行条件控制语句
-
回到‘2’继续
循环结构2
do…while循环结构
完整格式
初始化语句;
do{
循环体语句;
条件控制语句;
}while(条件判断语句);
执行流程
- 执行初始化语句
- 执行循环体语句
- 执行条件控制语句
- 执行条件判断语句,看其结果是true还是false
如果是false,循环结束
继续执行如果是true, - 回到2继续
三种循环的区别
三种循环的区别
- for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)
- do…while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断)
for循环和while的区别
- 条件控制语句所控制的自增变量,因为归属for循环的语法结构中,在for循环结束后,就不能再次被访问到了
- 条件控制语句所控制的自增变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用
死循环(无限循环)的三种格式
- for(😉
- while(true)
- do f while(true);
跳转控制语句
- 跳转控制语句(break)
o 跳出循环,结束循环 - 跳转控制语句 (continue)
- 跳过本次循环,继续下次循环
- 注意: continue只能在循环中进行使用!
循环嵌套
循环嵌套概述:在循环中,继续定义循环示例代码
理解:
请反复理解这句话(整个内循环,就是外循环的一个循环体,内部循环体没有执行完毕外循环是不会继续向下执行的)
结论:
外循环执行一次,内循环执行一圈
Random
Random产生随机数
概述:
Random类似Scanner,也是Java提供好的API,内部提供了产生随机数的功能API后续课程详细讲解,现在可以简单理解为Java已经写好的代码
使用步骤
1.入包
import java.util.Random.
2.创建对象
Random r= new Random0.
3.产生随机数
int num = rnextlnt(10);
解释
10代表的是一个范围,如果括号写10,产生的随机数就是0-9,括号写20,参数的随机数则是0-19
数组介绍
数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。
数组的定义格式
第一种格式
数据类型[]数组名
示例:
int[] arr;
double[] arr
char[] arr;
第二种格式
数据类型 数组名
示例:
int arr[];
double arr[l;
char arr[];
数组的动态初始化
什么是动态初始化
数组动态初始化就是只给定数泪的长度,由系统给出默认初始化值
动态初始化格式
数据类型[数组长度],数据类型[] 数组名 = new
int[] arr = new int[3];
动态初始化格式详解
-
等号左边:
int:数组的数据类型
[]:代表这是一个数组
arr:代表数组的名称 -
等号右边:
new:为数组开辟内存空间
int:数组的数据类型
[]:代表这是一个数组
5.代表数组的长度
package com.bukaedu.array;
public class Demo2Array {
/*
数组的动态初始化:在初始化的时候,需要手动指定数组的长度,系统会为数组容器分配初始值动态初始化格式:数据类型[] 数组名 = new 数据类型[数组的长]注意:打印数组变量的时候,会打印出数组的内存地址
[I@10f87f48 :
@ : 分隔符
[ : 当前的空间是一个数组类型
I : 当前数组容器中所存储的数据类型
10F87f48 : 十六进制内存地址
0123456789abcdef
*/
public static void main(String[] args) [
// 数据类型[] 数名 = new 数据类型[数组的长];
// 通过new关键字创建了一个int类型的数组容器,该容器可以存储5个int类型的整数,该容器被arr数组变量所记录
int[] axr = new int[5];
// [I@10F87F48
System.out.printin(arr);
byte[] bArr = new byte[3];
// [BEb4c966a
System.out.printin(bArr);
}
}
数组元素访问
什么是索引
每一个存储到数组的元素,都会自动的拥有一个编号,从0开始。
这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素
访问数组元素格式
数组名[索引];
内存分配
内存概述
- 内存是计算机中的重要原件,临时存储区域,作用是运行程序
- 我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的.
- 必须放进内存中才能运行,运行完毕后会清空内存.
- Java虚拟机要运行程序,必须要对内存进行空间的分配和管理.
java中的内存分配
目前我们只需要记住两个内存,分别是:栈内存和堆内存
区域名称 | 作用 |
---|---|
寄存器 | 给CPU使用,和我们开发无关 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关 |
方法区 | 存储可以运行的class文件 |
堆内存 | 存储对象或者数组,new来创建的,都存储在堆内存 |
方法栈 | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行 |
数组的静态初始化
什么是静态初始化
在创建数组时,直接将元素确定
静态初始化格式
完版格式
数据类型[] 数组名 = new 数据类型[]{元素1元素2,---};
简化版格式
数据类型[]数组名 ={元素1元素2.---};
数组操作的两个常见问题
索引越界异常
出现原因
publie class AxrayDemo{
public statie void main(8txingl] args) {
int[] arr = new int[3];
System.out.println(arr[3]);
}
}
数组长度为3,索引范围是0~2,但是我们却访问了一个3的素引。
程序运行后,将会抛出AraylndexOutOBoundsException 数组越界异常。在开发中,数的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。
解决方案
将错误的索引修改为正确的索引范围即可!
空指针异常
出现原因
public elass AxrayDemo {
public static void main(8txingll axgs) {
int[] arr = new int[3];
//把nu11财值给数组
Axx = nu11:
System.out.println(arr[0]);
}
}
aT =nul 这行代码,意味着变量ar将不会在保存数组的内存地址,也就不允许再提作数组了,因此运行的时候会抛出NullPointerException 空指针异常。在开发中,空指针异常是不能出现的,一旦出现了,就必须要修改我们编写的代码
解决方案
给数组一个真正的堆内存空间引用即可!
方法
方法的概念
方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集
注意:
-
方法必须先创建才可以使用,该过程成为方法定义
-
方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程成为方法调用
方法的定义和调用
无参数方法定义和调用
定义格式:
public static void 方法名(){
// 方法体;
}
带参数方法定义和调用
定义格式:
参数:由数据类型和变量名组成- 数据类型 变量名
参数范例:int a
public static void 方法名(参数1){
方法体;
}
public static void 方法名(参数1,参数2,参数3...){
方法体;
}
注意:
方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错
方法定义时,多个参数之间使用逗号(,)分隔
调用格式:
方法名(参数);
方法名(参数1参数2);
方法调用时,参数的数量与类型必须与方法定义中的设置相匹配,方法调用时,否则程序将报错
形参和实参
形参:方法定义中的参数,等同于变量定义格式,例如: int number
实参:方法调用中的参数,等同于使用变量或常量,例如: 10 number
方法的通用格式
格式:
public static 返回值类型 方法名(参数){
方法体;
return 数据;
}
解释:
-
publicstatic 修饰符,目前先记住这个格式
-
返回值类型 方法操作完毕之后返回的数据的数据类型
-
如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return
-
方法名 调用方法时候使用的标识
-
参数由数据类型和变量名组成,多个参数之间用逗号隔开
-
方法体完成功能的代码块
-
return 如果方法操作完毕,有数据返回,用于把数据返回给调用者
定义方法时,要做到两个明确:
明确返回值类型:
主要是明确方法操作完毕之后是否有数据返回,如果没有,写void;如果有,写对应的数据类型
明确参数:
主要是明确参数的类型和数量
调用方法时的注意:
- void类型的方法,直接调用即可
- 非void类型的方法,推荐用变量接收调用