十一、流程控制语句
1.if语句格式1
格式:
if (关系表达式) {
语句体;
}
执行流程:
1:首先计算关系表达式的值
2:如果关系表达式的值为true就执行语句体
3:如果关系表达式的值为false就不执行语句体
4:继续执行后面的语句内容
需求:判断a和b的值是否相等,如果相等,就在控制台输出:a等于b
public class Test_02if格式1 {
public static void main(String[] args) {
System.out.println("开始");
//定义两个变量
int a = 10;
int b = 20;
//需求:判断a和b的值是否相等,如果相等,就在控制台输出:a等于b
b=10;
if (a == b) {
System.out.println("a等于b");
}
System.out.println("结束");
}
}
2.if语句格式3
格式:
if (关系表达式1) {
语句体1;
} else if (关系表达式2) {
语句体2;
}
…
else {
语句体n+1;
}
执行流程:
1:首先计算关系表达式1的值
2:如果值为true就执行语句体1;如果值为false就计算关系表达式2的值
3:如果值为true就执行语句体2;如果值为false就计算关系表达式3的值
4:…
5:如果没有任何关系表达式为true,就执行语句体n+1。
需求:键盘录入一个星期数(1,2,...7),输出对应的星期一,星期二,...星期日
3.switch语句格式
格式:
switch(表达式) {
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
…
default:
语句体n+1;
[break;]
}
格式说明:
表达式:取值为byte、short、int、char,JDK5以后可以是枚举,JDK7以后可以是String。
case:后面跟的是要和表达式进行比较的值。
break:表示中断,结束的意思,用来结束switch语句。
default:表示所有情况都不匹配的时候,就执行该处的内容,和if语句的else相似。
执行流程:
首先计算表达式的值。
依次和case后面的值进行比较,如果有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。
如果所有的case后面的值和表达式的值都不匹配,就会执行default里面的语句体,然后程序结束掉。
需求:键盘录入一个星期数(1,2,...7),输出对应的星期一,星期二,...星期日
十二、循环语句
1.for语句
格式:
for(初始化语句;条件判断语句;条件控制语句) {
循环体语句;
}
执行流程:
1:执行初始化语句
2:执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
3:执行循环体语句
4:执行条件控制语句
5:回到2继续
2.while语句
基本格式:
while(条件判断语句) {
循环体语句;
}
完整格式:
初始化语句;
while(条件判断语句) {
循环体语句;
条件控制语句;
}
执行流程:
1:执行初始化语句
2:执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
3:执行循环体语句
4:执行条件控制语句
5:回到2继续
3.do...while语句
基本格式:
do {
循环体语句;
}while(条件判断语句);
完整格式:
初始化语句;
do {
循环体语句;
条件控制语句;
}while(条件判断语句);
执行流程:
1:执行初始化语句
2:执行循环体语句
3:执行条件控制语句
4:执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
5:回到2继续
4.for、while的不同点
十三、跳转控制语句
continue:用在循环中,满足判断条件的时候,跳过某次循环体内容的执行,继续下一次的执行
break:用在循环中,满足判断条件的时候,终止循环体内容的执行,也就是说结束当前的整个循环
public class Test_11控制跳转语句 {
public static void main(String[] args) {
for(int i = 1; i<=5; i++) {
if(i%2 == 0) {
continue;//1 3 5 7 9
//break;//1
//System.out.println(i);//2 4 6 8
}
System.out.println(i);//1
}
}
}
十四、随机数
作用:
用于产生一个随机数
使用步骤:
1:导包
import java.util.Random;
2:创建对象
Random r = new Random();
3:获取随机数
int number = r.nextInt(10);
获取数据的范围:[0,10) 包括0,不包括10
/*
//范围计算方法:
r.nextInt(x)+y 开始:y 结束:x-1+y
需求:开始 50 结束100
y=50
x-1+y=100
r.nextInt(51)+50
*/
十五、数组
1.数组的基本使用
定义格式:
数据类型[] 数组名;(推荐方式)
举例:int[] arr;
数据类型 数组名[];
举例:int arr[];
数组初始化:
A:所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值
B:数组初始化
动态初始化
静态初始化
动态初始化:
初始化时只指定数组长度,由系统为数组分配初始值
格式:数据类型[] 变量名 = new 数据类型[数组长度];
范例:int[] arr = new int[3];
静态初始化:
初始化时指定每个数组元素的初始值,由系统决定数组长度
格式:数据类型[] 变量名 = new 数据类型[]{数据1, 数据2, 数据3, ……};
范例: int[] arr = new int[]{1, 2, 3};
简化格式:数据类型[] 变量名 = {数据1, 数据2, 数据3, ……};
范例: int[] arr = {1, 2, 3};
补充:int[] arr = new int[]{1, 2, 3}; 中的new代表在堆内存中开辟空间
2.初始化默认值
数组在初始化时,会为存储空间添加默认值
整数:默认值0
浮点数:默认值0.0
布尔值:默认值false
字符:默认值是空字符
引用数据类型:默认值是null
3.内存分配
数组(引用类型)赋值,传递的是地址值
两个数组指向同一个地址,一个数组对其内容进行修改,另一个也随之改变。
参考资料:素材\7.多个数组指向相同内存.pptx
十六、Java中的堆与栈
1.在Java中:声明的对象是先在栈内存中为其分配地址空间,在对其进行实例化后则在堆内存中为其分配地址。 例如:
Person p = null ; //只在Stack Memory中为其分配地址空间
p = new Person(); //则在Heap Memory中为其分配内存地址
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间, 当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。 堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。
2.在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。
引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。
而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。
3.堆就是Java代码可及的内存,是留给开发人员使用的;
非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)方法和构造方法 的代码。
十七、数组的遍历
遍历:从头到尾,依次访问数组每一个位置,获取每一个位置的元素.
形式如下: 我们通过数组的下标操作数组,所以for循环变量操作的也是数组下标
开始:开始下标0 结束:结束下标length 如何变化:++
for(从下标为0的位置开始 ; 下标的取值 < 数组的长度 ; 下标++){
循环体;
}
十八、二维数组
1.访问元素格式
//数据类型[][] 变量名 = new 数据类型[一维数组个数][每个一维数组元素个数];
int[][] arr1 = new int[2][]; //二维数组里存储了两个null
/*
{
null,
null
}
*/
int[][] arr2 = new int[2][0]; //二维数组里存储了两个一位数组,每个一维数组有0个元素
/* {
{},
{}
}*/
int[][] arr3 = new int[2][2]; //二维数组里存储了两个null,每个一维数组有2个元素
/* {
{0,0},
{0,0}
}*/
//静态初始化 可以定义长度不同的一维数组。
//数据类型 [][] 变量名 = new 数据类型[][] {数据1, 数据2,…}, {数据1, 数据2,…}, ……}
//int[][] arr4 = new int[][]{
// {1, 2},
// {3, 4, 5},
// {6, 7, 8, 9}
//};
//简化格式
int[][] arr4 = {
{1, 2},
{3, 4, 5},
{6, 7, 8, 9}
};
2.遍历通用格
for(int i=0;i<arr.length;i++){
int[] arr2 = arr[i];
for(int i=0;i<arr2.length;i++){
//通过arr[i]方法数组中的每一个元素
}
}
3.遍历数组的三种方法
for for-each, toString
public static void main(String[] args) {
int[][] arr = {{1, 2}, {4, 5, 6}};
//遍历二维数组,获取到每一个一维数组
//for (int i = 0; i < arr.length; i++) {
// //获取元素(一维数组)
// int[] arr2 = arr[i];
// //获取了一维数组,再去遍历一维数组
// for (int j = 0; j < arr2.length; j++) {
// System.out.println(arr2[j]);
// }
//}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
}