Java基础之循环控制语句、函数、数组
Java基础
1.循环控制语句: break、continue
public static void main(String[] args) {
/*
TODO 循环控制语句 - break
需要和 for 以及 while 循环搭配使用 当在循环中执行了 break语句 那么就可以退出当前循环
*/
int sum = 0;
for (int i = 1; i <= 1000; i++) {
sum += i;
if (i >= 100) {
break;
}
}
System.out.println("sum:" + sum);
sum = 0;
int num = 1;
while (true) {
if (num > 100){
// 当循环进入if中时,可以退出当前循环
break;
}
sum += num;
num += 1;
}
System.out.println("sum:" + sum);
/*
TODO 循环控制语句 - continue
需要和 for 以及 while 循环搭配使用 当在循环中执行了 continue 语句 那么就可以退出当次循环进入下一次循环
*/
// 对1~100之间所有的偶数进行求和
int sum = 0;
for (int i = 1; i <= 100; i++) {
if (i % 2 == 1) {
// 当i的值为奇数时,什么都不做,直接进入下一次循环
continue;
}
sum += i;
}
System.out.println("sum:" + sum);
//拓:
/*
TODO DEBUG: (Debug使用非常非常重要)
通过IDEA的工具,展示程序在运行时,每一步的过程,并对其进行控制
用法:
① 运行时需要右键选择 Debug 当前代码
② 在当前代码的左边控制栏 点击会出现红点 其作用是在Debug运行模式下,程序到该行时会暂停
③ 当程序暂停时,可以对程序进行控制
step over 表示执行当前代码文件中下一行代码
stop into 进入当前方法内
stop out 退出当前方法
Resume Program 从当前断点继续执行程序,到下一个断点继续暂停程序
④ 对于程序运行中可以打断点,使用 Resume Program 跳转到当前断点
*/
/*
TODO 双重循环控制语句下 continue 和 Break的使用
注意:
break 默认每次执行都只能退出一个循环
如果要退出多层循环,那么就需要对某一层循环进行标记 格式为:
标记信息:for / while 同时 break后加上 标记信息
continue和Break的用法一致
*/
wd:for (int i = 0; i < 5; i++) {
for (int j = 0; j <= i ; j++) {
System.out.print("*\t");
if (i == 3 && j ==2) {
break wd;
}
}
System.out.println();
}
System.out.println("=============");
for (int i = 0; i < 5; i++) {
for (int j = 0; j <= i ; j++) {
if (j == 2) {
continue;
}
System.out.print("*\t");
}
System.out.println();
}
}
2.方法/函数
public static void main(String[] args) {
/*
TODO 方法/函数
作用:
对于代码中重复出现的代码,进行包装,形成一个方法,在需要方法代码时,直接调用即可
格式:
修饰符 返回值类型 方法名称(参数列表){
方法体(方法执行时的代码)
return 值; 如果有返回值的情况下
}
修饰符: 用于修饰当前方法的访问权限,以及方法的类型 暂时使用 public static
返回值类型: 基本数据类型 / 引用类型 如果没有返回值此时需要使用 void 关键字 表示
方法名称: 要注意名称定义规则 首个单词首字母小写 其他单词首字母大写 单词间可以直接拼接
参数列表: 可以给定多个参数 格式: 参数类型 参数名
-> 1.形参 在参数列表中定义的 定义时,没有具体值 用于指代一个变量
-> 2.实参 在方法调用时,给方法的参数进行传入值称为实参
方法体: 具体的代码,可以直接调用其他方法
return: 如果方法没有返回值,可以不需要添加 对于Java来说 return 返回值需要和返回值类型相匹配,每次执行返回一个值
TODO 注意:
1.方法调用,可以直接使用方法名(参数值)
2.方法在传参时,需要类型想对应
3.方法与方法是平级关系,不能嵌套定义
4.方法调用的时候不用在传递数据类型
5.如果方法有明确的返回值,一定要有return带回一个值
*/
printFun();
int funRes = addFun(4, (short) 5);
System.out.println("funRes:" + funRes);
String str = strAddFun(3, (short) 4);
System.out.println(str);
int a = 3;
short b = 4;
String s = strAddFun(a, b);
// 方法内不能再定义方法
// public static int addFun1(int a, short b) {
// return a + b;
// }
}
public static void printFun() {
System.out.println("这是一个无参无返回值的函数");
}
public static int addFun(int a, short b) {
return a + b;
}
public static String strAddFun(int a, short b) {
return a + b + "";
}
3.方法重载
public static void main(String[] args) {
/*
TODO 方法重载
定义: 将方法名称相同,但是参数列表不同的函数的定义方式,成为方法的重载
注意: 方法的重载只和参数列表有关,和返回值无关
*/
// 将方法的结果作为另外一个方法的参数传入
System.out.println(add(3));
System.out.println(add(2, 3));
}
public static int add(int a){
return a+a;
}
public static int add(int a,int b){
return a+b;
}
// 错误 :返回值相同导致
// public static String add(int a,int b){
// return a+b+"";
// }
4.递归
public static void main(String[] args) {
/*
TODO 方法递归
注意:
1.方法内部调用自身
2.方法递归需要有停止标记 如果没有停止标记那么会出现 栈内存溢出错误 java.lang.StackOverflowError
*/
System.out.println(reloadFun(5)); // 120
/*
TODO 递归函数的调用逻辑 以 reloadFun(3)为例
reloadFun(3) n =3
-> n * reloadFun(n-1); n = 3 (必须先将 n * reloadFun(n-1); 计算完成才能执行return 返回数据 )
-> reloadFun(2)
-> n * reloadFun(n-1); n = 2
-> reloadFun(1)
-> return 1;
-> reloadFun(2) = n * reloadFun(1) => 2 * 1 = 2
-> 3 * reloadFun(2) = 3 * 2 = 6
程序执行结束
*/
reloadFunLong(10);
}
// 函数的递归调用
public static int reloadFun(int n){
System.out.println("接收到N:"+n);
// 当n不等于1时调用自身,等于1时返回结果1
if (n == 1){
return 1;
}else {
return n * reloadFun(n-1);
}
}
5.一维数组
public static void main(String[] args) {
/*
TODO Array 数组
定义: 将相同类型的数据汇集到一起,形成一个变量 改变成为数组 可以看成是一个容器
数组变量的形式为 引用类型,引用类型为空可以使用 null 来进行表示
格式1:数据类型[] 数组名;
初始化: ① 数据类型[] 数组名 = new 数据类型[长度] -> 动态初始化
② 数据类型[] 数组名 = new 数据类型[]{元素,元素,元素,...} -> 静态初始化
③ 数据类型[] 数组名 = {元素,元素,元素,...} -> 静态初始化
格式2:数据类型 数组名[]
① 数据类型 数组名[] = new 数据类型[长度] -> 动态初始化
② 数据类型 数组名[] = new 数据类型[]{元素,元素,元素,...} -> 静态初始化
③ 数据类型 数组名[] = {元素,元素,元素,...} -> 静态初始化
TODO 注意:
① 对于变量定义后需要对其进行初始化(赋值)
② 对于数组定义后,其长度固定
③ 通过数组的下标可以对数组元素进行赋值,同时也可以进行取值,同时下标从0开始
④ 对于数组初始化后,对其中每个下标对应位置保存的数据也进行了初始化,使用相对应的默认值进行填充
例如 String -> null
*/
// 需求:定义员工姓名 => 姓名元素是一个字符串 => String 类型
// String[] employName = null;
String[] employName = new String[3];
employName = new String[4];
employName[0] = "李白";
employName[1] = "杜甫";
employName[2] = "白居易";
// employName[3] = "李国涛";
// 超过长度后出错: java.lang.ArrayIndexOutOfBoundsException -> 数组越界异常
employName[3] = "纳兰性德";
System.out.println(employName); // [Ljava.lang.String;@4554617c => [ 数组 java.lang.String 存储的元素类型 @4554617c 地址
System.out.println(employName[0]); // 李白
System.out.println(employName[1]); // 杜甫
System.out.println(employName[2]); // 白居易
System.out.println(employName[3]); // 纳兰性德
/*
定义两个数组,先定义一个数组,赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。
然后给第二个数组赋值,再次输出两个数组的名及元素。
TODO 两个变量指向同一个对象地址
当对变量进行操作时,实际上就是对其变量保存的内存地址上的对象数据进行操作
*/
String[] names1 = new String[3];
String[] names2 = new String[2];
names1[0] = "唐三";
names1[1] = "小舞";
names2[0] = "大明";
// 将 names2 的内存地址赋予给 names2, names2保存的内存地址也存在
//此时names2、names2指向内存中的同一块地址,因此当二者无论谁操作都会引起内存中值的变化
names1 = names2;
System.out.println(names1[0]);//大明
names1[1] = "唐三";
System.out.println(names2[1]); //唐三
}
6.数组的遍历、最值、逆序
public static void main(String[] args) {
/*
TODO 数组常见操作:
1.数组遍历
*/
// TODO 1.数组遍历
int numArr[] = {1, 2, 3, 3, 2, 1, 4, 5, 6};
// numArr.length 表示数组的长度
for (int i = 0; i < numArr.length; i++) {
// 遍历所有的下标,根据下标进行取数据
System.out.println("获取到数据:" + numArr[i]);
}
System.out.println("+++++++++++分割+++++++++++");
int index = 0;
while (index < numArr.length) {
System.out.println("获取到数据:" + numArr[index]);
index++;
}
System.out.println("+++++++++++分割+++++++++++");
// TODO 注意: 增强for遍历数据
// 每次循环都直接取出 数组中的元素
for (int elem : numArr) {
System.out.println("获取到数据:" + elem);
}
/*
TODO 数组获取最值(获取数组中的最大值最小值)
*/
int max = numArr[0];
int min = numArr[0];
for (int elem : numArr) {
max = elem > max ? elem : max;
min = elem < min ? elem : min;
}
System.out.println("max:"+max);
System.out.println("min:"+min);
/*
TODO 数组元素逆序 (就是把元素对调)
*/
for (int i = 0; i < numArr.length / 2; i++) {
int tmpNum = numArr[i];
numArr[i] = numArr[numArr.length - i - 1];
numArr[numArr.length - i - 1] = tmpNum;
}
System.out.println("====================分割====================");
for (int elem : numArr) {
System.out.println("获取到数据:" + elem);
}
}
7.二维数组
public static void main(String[] args) {
/*
TODO 二维数组
格式1
数据类型[][] 变量名 = new 数据类型[m][n];
格式2:
数据类型[][] 变量名 = new 数据类型[m][];
格式3
数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};
数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};
二维数组 赋值及取值 => 变量名[一维下标][二维下标]
*/
String[][] allClassStu = new String[30][40];
// 当直接使用变量名[] 可以取出一个维度中的数组
String[] oneClassStu = allClassStu[1];
oneClassStu[0] = "张三";
oneClassStu[1] = "李四";
System.out.println(oneClassStu[0]);
System.out.println(oneClassStu[1]);
System.out.println(allClassStu[1][0]);
// 对于每个班级的学生人数不一样
String[][] allClassStu2 = new String[30][];
String[] oneClassStu2 = allClassStu2[29];
// oneClassStu2[0] = "王五"; // java.lang.NullPointerException => 变量调用的内存地址为null 空
// System.out.println(allClassStu2[29][0]);
/*
TODO NullPointerException 问题
由于 new String[30][]; 定义时,对于第二个维度没有定义长度=> 没有进行实例化
allClassStu2 变量中 第一个维度中的数组 长度为 30 每个元素 为null
*/
// TODO 重新创建一个字符串数组 其长度为 22 将其内存地址 赋予给 allClassStu2 变量的第29个下标的位置
allClassStu2[29] = new String[22];
allClassStu2[29][0] = "邱六";
System.out.println(allClassStu2[29][0]);
int[][] allInt = {{1, 2, 4}, {2, 3, 4}, {2, 3, 4}};
// 双循环遍历二维数组中的所有数据
for (int i = 0; i < allInt.length; i++) {
for (int index = 0; index < allInt[i].length; index++) {
System.out.println(allInt[i][index]);
}
}
int[][] allSalary = {
{22, 66, 44}
, {77, 33, 88}
, {25, 45, 65}
, {11, 66, 99}
};
//增强for循环遍历二维数组
int sum = 0;
for (int[] oneArr : allSalary) {
for (int elem : oneArr) {
sum += elem;
}
}
System.out.println("sum:" + sum);
}
原文地址:https://blog.csdn.net/m0_58050808/article/details/137935062
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!