类型转换:
1.数据类型转换之隐式转换(表示数据范围从小到大)
- 小的数据类型,和大的数据类型运算,小的会提升为大的之后,再进行运算
- 特殊关注:byte short char 三种数据在运算的时候,不管是否有更高的数据类型,都会提升为int,然后再进行运算
2.类型转换之强制转换
强制转换:把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量
格式:目标数据类型 变量名 = (目标数据类型)值或者变量;
范例:int k = (int)88.88;
注意:强制类型转换,有可能会发生精度损失
精度损失:简单理解,将容积为8升的容器中的水,倒入容积为4升的容器中,如果水超出了4升,就洒了。
常量优化机制:
在编译时(javac),整数常量的计算会直接算出结果,并且会自动判断该结果是否在byte取值范围内在:编译通过不在:编译失败
3、算术运算符
-
Java程序中,整数运算,结果只能得到整数,想得到小数,需要浮点数参与运算
-
整数的除法运算得到的是商
-
整数的取余运算得到的是余数
字符的+操作知识总结:
自增自减运算符
赋值运算符
关系运算符(小于、小于等于、大于、等于、大于等于、不等于)
逻辑运算符
-
&&:逻辑与 运算结果与&相同,但具有短路效果,一旦发现坐标的表达式结果为false,右边的表达式将不在参与运算
-
||:逻辑或: 运算结果与|相同,但具有短路效果,一旦发现左边的表达式结果为true,右边的表达式将不在运算
在我们的代码书写中,逻辑与和或的运算,实际使用就是短路的逻辑运算符
三元运算符
public class TernaryOperatorExample {
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
// 使用三元运算符比较两个数的大小,并返回较大的数
int maxNum = (num1 > num2) ? num1 : num2;
// 输出结果
System.out.println("较大的数是:" + maxNum);
}
}
顺序结构
流程控制语句分类
-
顺序结构
-
分支结构(if, switch)
-
循环结构(for, while, do…while)
顺序结构:顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。
if结构
if...else结构
if...else...if结构
switch语句
执行流程:
-
首先计算switch()小括号中的值
-
其次,按顺序从上到下,依次跟case和default进行比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束
注意事项
-
switch中()支持的数据类型
1.5之前 byte short char(字符型) int1.5之后 enum (枚举 1.5新特性)1.7之后 String(字符串)
-
case后面跟随的是待匹配的值,只能是常量并且不能重复。
-
default就跟else是一样的,当上面所有的值都不匹配,那么就会执行default里面的语句体
switch语句练习
需求:键盘录入星期数,显示今天的减肥活动
周一:跑步
周二:游泳
周三:慢走
周四:动感单车
周五:拳击
周六:爬山
周日:好好吃一顿
import java.util.Scanner;
public class Test01 {
public static void main(String[] args){
// 1. 键盘录入星期数据,使用变量接收
Scanner sc = new Scanner(System.in);
System.out.println("请输入星期几");
int week = sc.nextInt();
// 2. 多条件判断,采用switch语句实现
switch(week){
// 3. 在不同的case中,输出对应的减肥计划
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("您的输入有误");
break;
}
}
}
-
什么情况下会出现case穿透 ?
如果switch语句中,case省略了break语句, 就有可能会出现case穿透。
-
出现case穿透之后有什么现象?
后面的case条件将不再进行比较,直接进入语句体执行。
-
case穿透什么时候结束?
遇到下一个break或者整个switch语句结束。
-
什么情况下用case穿透?
当多个条件干的事是一样的时候。
示例代码:
需求 : 键盘录入星期数,输出工作日、休息日 (1-5)工作日,(6-7)休息日
/*
case穿透是如何产生的?
如果switch语句中,case或者default省略了break语句, 就会开始case穿透.
现象:
当开始case穿透,后续的case就不会具有匹配效果,内部的语句都会执行
直到看见break,或者将整体switch语句执行完毕,才会结束。
*/
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入星期数:");
int week = sc.nextInt();
switch(week){
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("工作日");
break;
case 6:
case 7:
System.out.println("休息日");
break;
}
}
}
for循环
for (初始化语句;条件判断语句;条件控制语句) {
循环体语句;
}
-
格式解释:
-
初始化语句: 用于表示循环开启时的起始状态,简单说就是循环开始的时候什么样
-
条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行下去
-
循环体语句: 用于表示循环反复执行的内容,简单说就是循环反复执行的事情
-
条件控制语句:用于表示循环执行中每次变化的内容,简单说就是控制循环是否能执行下去
-
-
执行流程:
①执行初始化语句
②执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
③执行循环体语句
④执行条件控制语句
⑤回到②继续
//求和思想
public class ForTest02 {
public static void main(String[] args) {
//求和的最终结果必须保存起来,需要定义一个变量,用于保存求和的结果,初始值为0
int sum = 0;
//从1开始到5结束的数据,使用循环结构完成
for(int i=1; i<=5; i++) {
//将反复进行的事情写入循环结构内部
// 此处反复进行的事情是将数据 i 加到用于保存最终求和的变量 sum 中
sum += i;
/*
sum += i; sum = sum + i;
第一次:sum = sum + i = 0 + 1 = 1;
第二次:sum = sum + i = 1 + 2 = 3;
第三次:sum = sum + i = 3 + 3 = 6;
第四次:sum = sum + i = 6 + 4 = 10;
第五次:sum = sum + i = 10 + 5 = 15;
*/
}
//当循环执行完毕时,将最终数据打印出来
System.out.println("1-5之间的数据和是:" + sum);
}
}
案例 水仙花数:
水仙花数,指的是一个三位数,个位、十位、百位的数字立方和等于原数
-
例如
153 3*3*3 + 5*5*5 + 1*1*1 = 153
思路:
-
获取所有的三位数,准备进行筛选,最小的三位数为100,最大的三位数为999,使用for循环获取
-
获取每一个三位数的个位,十位,百位,做if语句判断是否是水仙花数
public class ForTest04 {
public static void main(String[] args) {
//输出所有的水仙花数必然要使用到循环,遍历所有的三位数,三位数从100开始,到999结束
for(int i=100; i<1000; i++) {
//在计算之前获取三位数中每个位上的值
int ge = i%10;
int shi = i/10%10;
int bai = i/10/10%10;
//判定条件是将三位数中的每个数值取出来,计算立方和后与原始数字比较是否相等
if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i) {
//输出满足条件的数字就是水仙花数
System.out.println(i);
}
}
}
}
循环语句-while循环
初始化语句;
while (条件判断语句) {
循环体语句;
条件控制语句;
}
while循环执行流程:
①执行初始化语句
②执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
③执行循环体语句
④执行条件控制语句
⑤回到②继续
public class WhileDemo {
public static void main(String[] args) {
//需求:在控制台输出5次"HelloWorld"
//for循环实现
for(int i=1; i<=5; i++) {
System.out.println("HelloWorld");
}
System.out.println("--------");
//while循环实现
int j = 1;
while(j<=5) {
System.out.println("HelloWorld");
j++;
}
}
}
案例1 珠穆朗玛峰
需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
public class WhileTest {
public static void main(String[] args) {
//定义一个计数器,初始值为0
int count = 0;
//定义纸张厚度
double paper = 0.1;
//定义珠穆朗玛峰的高度
int zf = 8844430;
//因为要反复折叠,所以要使用循环,但是不知道折叠多少次,这种情况下更适合使用while循环
//折叠的过程中当纸张厚度大于珠峰就停止了,因此继续执行的要求是纸张厚度小于珠峰高度
while(paper <= zf) {
//循环的执行过程中每次纸张折叠,纸张的厚度要加倍
paper *= 2;
//在循环中执行累加,对应折叠了多少次
count++;
}
//打印计数器的值
System.out.println("需要折叠:" + count + "次");
}
}
dowhile循环
初始化语句;
do {
循环体语句;
条件控制语句;
}while(条件判断语句);
执行流程:
① 执行初始化语句
② 执行循环体语句
③ 执行条件控制语句
④ 执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
⑤ 回到②继续
public class DoWhileDemo {
public static void main(String[] args) {
//需求:在控制台输出5次"HelloWorld"
//for循环实现
for(int i=1; i<=5; i++) {
System.out.println("HelloWorld");
}
System.out.println("--------");
//do...while循环实现
int j = 1;
do {
System.out.println("HelloWorld");
j++;
}while(j<=5);
}
}
三种循环的区别
-
for、while:
先判断,再执行。
当第一次循环的时候,判断就为假,那么循环体是执行不到的。
do...while:
先执行,再判断。
当第一次循环的时候,判断就为假,那么循环体至少执行一次。
-
for和while的区别
-
初始化变量作用域
for:初始化变量是定义在循环里面的,所以循环结束变量不能使用。
while:对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用。
-
使用习惯
for:当我们知道循环的次数。
while:当我们不知道循环的次数,但是知道循环的结束条件。
注意:for和while循环二者之间可以相互转换,上面说的使用习惯只是多用于这种情况。
-