Java 重点语法
流程控制能让程序根据不同情况执行不同逻辑,方法用于封装代码实现复用,数组则方便我们存储和操作一组同类型数据。下面聚焦这些重点内容展开。
一、流程控制:分支与循环
(一)Switch 分支判断
switch
语句用于多分支选择,它会根据表达式的值,匹配对应的 case
分支执行。基本语法如下:
switch (表达式) {case 值 1:// 当表达式值等于值 1 时执行的代码break;case 值 2:// 当表达式值等于值 2 时执行的代码break;// 更多 case 分支default:// 当表达式值不匹配任何 case 时执行的代码
}
需要注意的是,switch
表达式的类型在 Java 5 及以前只能是 byte
、short
、char
、int
;Java 7 开始支持 String
类型;Java 14 及以后还支持 enum
(枚举)和 sealed
类型等。另外,break
用于跳出 switch
语句,如果没有 break
,会发生 “穿透” 现象,即匹配到某个 case
后,会继续执行后面所有 case
的代码,直到遇到 break
或者 switch
结束。“穿透” 特性在某些场景下可以利用,比如多个 case
需要执行相同代码时。例如,根据星期几判断是否为工作日:
String day = "Monday";
switch (day) {case "Monday":case "Tuesday":case "Wednesday":case "Thursday":case "Friday":System.out.println(day + " 是工作日");break;case "Saturday":case "Sunday":System.out.println(day + " 是休息日");break;default:System.out.println("输入的星期不合法");
}
再比如,使用 enum
类型的 switch
示例:
enum Season { SPRING, SUMMER, AUTUMN, WINTER }
Season season = Season.SUMMER;
switch (season) {case SPRING:System.out.println("春天,万物复苏");break;case SUMMER:System.out.println("夏天,烈日炎炎");break;case AUTUMN:System.out.println("秋天,硕果累累");break;case WINTER:System.out.println("冬天,白雪皑皑");break;
}
(二)do - while 循环
do - while
循环的特点是先执行循环体,再判断循环条件,也就是说,循环体至少会执行一次。这和 while
循环(先判断条件,再执行循环体)有所不同,while
循环有可能一次都不执行循环体。do - while
适合那些无论如何都要先执行一次操作的场景,比如用户输入验证,至少要让用户输入一次,再判断输入是否合法。语法格式为:
do {// 循环体代码
} while (循环条件);
比如,实现一个简单的数字累加,至少执行一次累加操作:
int i = 0;
int sum = 0;
do {sum += i;i++;
} while (i <= 10);
System.out.println("1 到 10 的和为:" + sum); // 输出:55
再比如,用户输入密码,直到输入正确为止:
Scanner scanner = new Scanner(System.in);
String correctPassword = "123456";
String inputPassword;
do {System.out.print("请输入密码:");inputPassword = scanner.nextLine();
} while (!inputPassword.equals(correctPassword));
System.out.println("密码输入正确!");
scanner.close();
二、函数(方法):封装与复用
(一)static 关键字修饰方法
被 static
修饰的方法是静态方法,静态方法属于类,而不是类的实例(对象)。我们可以通过 “类名。静态方法名” 的方式直接调用静态方法,无需创建类的对象。静态方法通常用于定义工具方法,这些方法不依赖于对象的状态,只进行一些通用的操作。例如:
public class MathUtil {// 静态方法,计算两个数的和public static int add(int a, int b) {return a + b;}// 静态方法,计算一个数的平方public static int square(int num) {return num * num;}
}// 在其他类中调用
public class Test {public static void main(String[] args) {// 直接通过类名调用静态方法 addint sumResult = MathUtil.add(3, 5);System.out.println("3 + 5 = " + sumResult); // 输出:3 + 5 = 8// 调用静态方法 squareint squareResult = MathUtil.square(4);System.out.println("4 的平方是:" + squareResult); // 输出:4 的平方是:16}
}
需要注意的是,静态方法中不能直接访问非静态成员(非静态变量和非静态方法),因为非静态成员属于对象,而静态方法在类加载时就存在,可能此时还没有创建对象。
三、数组:批量处理同类型数据
(二)二维数组
二维数组可以理解为 “数组的数组”,用于存储表格型数据(比如矩阵)。它的声明、初始化方式有多种,这里介绍常见的两种:
- 动态初始化:
// 声明一个二维 int 数组,有 2 行,每行的列数后续确定
int[][] arr = new int[2][];
// 为第一行分配 3 列的空间
arr[0] = new int[3];
// 为第二行分配 2 列的空间
arr[1] = new int[2];
// 给数组元素赋值
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
- 静态初始化:
// 直接初始化一个二维数组,包含两行三列的数据
int[][] arr = {{1, 2, 3}, {4, 5, 6}};
访问二维数组的元素时,通过 “数组名 [行索引][列索引]” 的方式,比如 arr[0][1]
表示访问第一行第二列的元素(值为 2)。遍历二维数组通常需要使用嵌套循环,外层循环控制行,内层循环控制列,例如:
int[][] arr = {{1, 2, 3}, {4, 5, 6}};
for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j] + " ");}System.out.println();
}
运行上述代码,输出结果为:
1 2 3
4 5 6
二维数组还可以用于更复杂的场景,比如存储学生的多门课程成绩,每行代表一个学生,每列代表一门课程的成绩,方便进行成绩的统计(如计算每个学生的总分、平均分,每门课程的平均分等)。例如:
// 学生成绩数组,每行是一个学生的语文、数学、英语成绩
int[][] scores = {{85, 90, 92}, {78, 88, 80}, {95, 92, 98}};
// 计算每个学生的总分
for (int i = 0; i < scores.length; i++) {int total = 0;for (int j = 0; j < scores[i].length; j++) {total += scores[i][j];}System.out.println("学生 " + (i + 1) + " 的总分是:" + total);
}