一. 运算符
(一) 三元运算
1.元的概念: 可以操作的数据或者表达式.
2.三元运算符: 别名三目运算符,同时可以操作三个数据或者表达式的运算符.
3.格式:
表达式1 ? 表达式2 : 表达式3;
4.说明:
1)表达式1必须是boolean类型的表达式,计算结果只能是true、或者false
2)表达式2和表达式3可以是任意类型的表达式
5.运算流程:
1)计算表达式1的值,要么为true,要么为false
2)如果表达式1计算结果为true,就选择表达式2作为三元表达式的计算结果
3)如果表达式1计算结果为false,就选择表达式3作为三元表达式的计算结果
案例1: 获取两个整数的较大值
案例2: 判断一个正整数变量是奇数还是偶数
public class Demo08_三元运算 {
public static void main(String[] args) {
// 1. 定义两个整数, 获取出较大值
int x = 78;
int y = -9;
// 表达式1 ? 表达式2 : 表达式3;
int max = x >= y ? x : y;
System.out.println(max);
// 案例2: 判断一个正整数变量是奇数还是偶数
int w = 19;
String str = w % 2 == 0 ? w+"是偶数" : w+"是奇数";
System.out.println(str);
// 案例3: 定义出三个整数, 求出最大值
// max1表示三个数中的最大值
int max1 = x > y ? x : y;
max1 = max1 > w ? max1 : w;
System.out.println(max1);
}
}
二. 键盘录入之Scanner类
1.键盘录入: Scanner类,来自于java.util包,是JDK提供的类型.
2.作用: 在程序运行的过程中,可以使用Scanner类来实现获取从键盘输入的数据,提高数据来源灵活度.
3.Scanner类使用步骤:
第一步: 导包
目的: 为了让JVM定位到Scanner类型所在的具体路径
导入方式: 类的声明之上使用关键字import,表示导入
import java.util.Scanner;
第二步: 创建键盘录入对象,Scanner sc = new Scanner(System.in);
第三步: 调用sc对象的nextInt方法,获取键盘录入的一个整数
int x = sc.nextInt();
第四步: 使用x后续处理
案例1: 键盘录入两整数求和
案例2: 键盘录入三整数求最大值
案例3: 键盘录入一整数,判断奇偶
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
// 数据类型 变量名 = 变量值; int a = 10; String str = "abc"
// 1. 键盘录入两整数求和, sc是一个变量名,变量表示的Scanner键盘录入类型
// System.in : 表示Scanner类型获取的数据, 来源默认就是键盘输入
Scanner sc = new Scanner(System.in);
// 注意: 键盘录入数据功能都有阻塞效果,因此在输入数据之前给提示信息
System.out.println("请输入第一个整数:");
int x = sc.nextInt();
System.out.println("请输入第二个整数:");
int y = sc.nextInt();
System.out.println("两数的和为:" + (x + y));
}
}
import java.util.Scanner;
public class ScannerTest {
public static void main(String[] args) {
// 案例2: 键盘录入三整数求最大值
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个整数:");
int first = sc.nextInt();
System.out.println("请输入第二个整数:");
int second = sc.nextInt();
System.out.println("请输入第三个整数:");
int third = sc.nextInt();
// max表示三个数中的最大值
int max = first >= second ? first : second;
max = max >= third ? max : third;
System.out.println("三个数最大值为:" + max);
}
}
扩展Random类使用:
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
/*
1. Random类: 由JDK提供,来自于java.util包, 功能是可以生成一个指定范围内的随机数
2. Random类使用步骤
1) 导包import java.util.Random; 声明Random所在具体路径
2) 创建出一个Random类型对象(对比Scanner):
Scanner sc = new Scanner(System.in);
Random ran = new Random();
3) 使用ran,表示Random类型,调用
nextInt(int number): 生成一个0-(number-1)之间的任意随机整数,[0,number),包含0数值但是不包含number
*/
// 1. 生成1-100之间的任意随机数
Random ran = new Random();
int number = ran.nextInt(100) +
1;// (0-99) + 1
System.out.println(number);
}
}
三. 流程控制
(一) 流程控制概述
1.流程控制概念: 控制代码的执行顺序就是流程控制.
2.流程控制的分类:
顺序结构: 代码从上到下,从左到右依次执行.
分支结构: 根据条件选择执行路径
代码特点: 写得多,执行的少
语句实现: if条件语句三种格式,switch开关选择语句
循环结构: 相同相似的代码逻辑在符合条件的情况下,可以多次反复的执行
代码特点: 写得少,执行的多
语句实现: for循环语句,while循环语句,do while循环语句,continue继续语 句,break终止语句,return返回语句.
(二) 分支结构之if条件语句
1.1 if语句的第一种格式
1.格式:
if(布尔表达式) {
语句体;
}
2.说明:
1)if,关键字,表示如果的含义
2)if语句后面跟着的小括号,里面必须是boolean类型的值;计算结果为true或者false.
3)语句体,可以是任意逻辑代码
3.执行流程:
1)计算布尔表达式的值,要么为true,要么为false
2)如果计算结果为true,执行语句体
3)如果计算结果为false,就不执行语句体
4.注意事项:
1)小括号后面不要加分号,一般来说,有左大括号,就没有分号,有分号,就没有左大括号.
2)如果if语句体只有一句代码,大括号可以省略,但是建议所有情况都加上大括号,不要省略.
案例1: 某公司现在要给员工进行薪资调整, 工作年龄大于等于5年, 加薪3000元, 工龄不够5年的, 没有加薪
5.实际开发场景使用:
1. 数据验证: 例如客户注册页面, 需要注册信息, 后台需要验证这些注册信息是否符合一定规范
if (姓名不符合规范){
直接抛出错误提示信息,让代码停止;
}
if(...){
}
2. 金融产品中, 对于产品定价不同; 某一些公司产品销售需要有额外的加价, 因此在计算产品金额时候, 就需要进行验证
if (产品属于A公司的){
价格+5;
}
public class Demo01_If {
public static void main(String[] args) {
// 定义出员工基本薪资
double salary = 10000;
// 定义出员工工龄
int workAge = 4;
// 验证员工是否可以涨薪
if (workAge >= 5){
salary += 3000; // salary = salary + 3000;
}
System.out.println("员工工作了" + workAge + "年,目前薪资为:" + salary);
}
}
1.2 if语句的第二种格式
1.格式:
if (boolean类型条件表达式) {
语句体1;
} else {
语句体2;
}
2.执行流程:
1)计算条件表达式的值,要么为true,要么为false
2)如果条件表达式的值为true,执行语句体1
3)如果条件表达式的值为false,执行语句体2
3.注意事项:
1) else是关键字, 表示其他, 是除了if条件之外的所有其他
2) if中的语句体1和else中的语句体2,一定会执行其中一个,不可能全执行或者全不执行.
案例1: 某公司现在要给员工进行薪资调整,根据工龄决定涨薪级别
1)[0-5): 涨薪2000元
2)[5-10): 涨薪3000元
3)[10-15): 涨薪4000元
4)[15,以上): 涨薪5000元
public class Demo03_IfElseIf {
public static void main(String[] args) {
double salary = 10000;
int workAge = 17;
// 根据工作年限计算出员工涨薪的级别
if(workAge < 0){
System.out.println("工龄输入有误,无法涨薪");
}else if (workAge >= 0 && workAge < 5){
salary += 2000;
}else if(workAge >= 5 && workAge < 10){
salary += 3000;
}else if(workAge >= 10 && workAge < 15){
salary += 4000;
}else {
salary += 5000;
}
// 健壮性验证: 只有工龄正确的, 才会输出对应的数据结果
if(workAge >= 0){
System.out.println("员工工作了" + workAge + "年,目前薪资为:" + salary);
}
}
}
注意事项和优化
public class Demo04_IfElseIf注意事项 {
public static void main(String[] args) {
double salary = 10000;
int workAge = 9;
// 根据工作年限计算出员工涨薪级别
if(workAge < 0){// false, 证明workAge >= 0
System.out.println("工龄输入有误,无法涨薪");
}else if (workAge < 5){// false, 证明workAge >= 5
salary += 2000;
}else if (workAge < 10){// false, 证明workAge >= 10
salary += 3000;
}else if (workAge < 15){// false, 证明workAge >= 15
salary += 4000;
}else if(workAge >= 15){
salary += 5000;
}
// 健壮性验证: 只有工龄正确, 才会输出对应的数据结果
if(workAge >= 0){
System.out.println("员工工作了" + workAge + "年,目前薪资为:" + salary);
}
}
}
(三) 分支结构之switch开关语句
1.1 switch语法
1.switch: 表示英文中的开关,每个条件都像一扇门,开着的,就进门执行,否则就到下一扇门判断.
2.格式:
switch (表达式) {
case 常量1:
语句体1;
break;
case 常量2:
语句体2;
break;
case 常量n:
语句体n;
break;
default:
语句体n+1;
}
3.关键字解释:
switch: 开关;
case: 情况;
break: 破坏,退出,结束;
default: 默认;
4.执行流程:
1)计算switch小括号中表达式的值,分别和case后的各个常量值匹配
2)如果和常量1匹配,那么就执行语句体1,执行break,switch语句结束
3)如果和常量1不匹配,那么就判断是否和常量2匹配,如果匹配就执行语句体2,执行break,switch语句结束
4)以此类推,如果常量1~常量n全都没有和表达式的值匹配,那么就执行default中的内容,switch语句结束
案例1: 键盘录入一个整数,用于进行星期匹配,数据范围1-7,对应匹配星期一到星期天,如果不是1-7范围,那么报出数据错误提示信息
import java.util.Scanner;
public class Demo05_SwitchCase {
public static void main(String[] args) {
//案例1: 键盘录入一个整数,用于进行星期匹配,数据范围1-7,对应匹配星期一到星期天,如果不是1-7范围,那么报出数据错误提示信息
Scanner sc = new Scanner(System.in);
System.out.println("请输入1-7的数据,用于匹配星期");
int weekday = sc.nextInt();
// 验证输入的数据对应匹配的星期
switch(weekday) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("输入数据有误");
}
}
}
1.2 switch语句的注意事项
1.switch小括号表达式数据类型:
Jdk1.5之前: byte,short,char,int
Jdk1.5: 枚举类型
Jdk7: String
2.case后面只能跟常量,不能跟变量
3.每个case语句体后面, 要跟上一个break语句,否则就无法结束switch语句,并且发生case穿透.
case穿透的利用: 多个case情况如果是相同的执行逻辑,可以在最后一个case语句后再使用break,在switch语句中,如果case的后面不写break,也就不会再判断下一个case的值,直接向后寻找一切可执行语句运行,直到遇到break,或者整体switch结束.
4.default语句: 可以写也可以不写.如果不写,就有可能一个语句都执行不到,建议把default语句加上.
5.default语句可以写在任意位置,无论写在什么位置,都是最后去匹配,建议把default语句写在最后.
6.switch语句结束的条件: 遇到break语句; 遇到switch语句执行全部结束.
案例1: 键盘录入一个整数,用于进行工作日与休息日匹配,数据范围1-5,输出工作日;
数据范围6-7输出休息日; 其余数据报出”数据有误”提示信息
案例2: 键盘录入一个月份,输出这个月份对应的季节345月是春季,678是夏季,9、10、11秋季,12、1、2冬季,其他数字,没有任何季节,提示录入错误
import java.util.Scanner;
public class Demo06_Switch注意事项 {
public static void main(String[] args) {
/* 案例1: 键盘录入一个整数,用于进行工作日与休息日匹配,数据范围1-5,输出工作日;
数据范围6-7输出休息日; 其余数据报出”数据有误”提示信息*/
Scanner sc = new Scanner(System.in);
System.out.println("请输入1-7数据,匹配工作日和休息日");
int weekday = sc.nextInt();
/*switch(weekday){
case 1:
System.out.println("工作日");
break;
case 2:
System.out.println("工作日");
break;
case 3:
System.out.println("工作日");
break;
case 4:
System.out.println("工作日");
break;
case 5:
System.out.println("工作日");
break;
case 6:
System.out.println("休息日");
break;
case 7:
System.out.println("休息日");
break;
default:
System.out.println("数据有误");
}*/
// 穿透性
/*switch(weekday){// weekday = 2
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("工作日-----");
//break;
case 6:
case 7:
System.out.println("休息日-----");
//break;
default:
System.out.println("数据有误-----");
}*/
// switch中的default逻辑可以没有
// switch中的default就是与ifelse中的else同等存在原理
// 如果没有default有可能所有的case全部匹配失败,导致分支结构没有选择
switch(weekday){// weekday = 2
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("工作日-----");
break;
case 6:
case 7:
System.out.println("休息日-----");
break;
}
}
}