🍊前言:
关于 Java 语言基础知识同学们需要学会什么?
🍉类型转换
1.自动类型转换
什么是自动类型转换,为什么要学习自动类型转换?
类型范围小 的变量,可以 直接赋值 给 类型范围大 的变量。
自动类型转换的底层原理
byte a = 12 ; int b = a; System.out.println(b); // 12
自动类型转换的其他形式
public class base { public static void main(String[] args) { char a='a'; int b=a; System.out.println("a:"+a); System.out.println("b:"+b); byte c = 12 ; int d = c; System.out.println("d:"+d); // 12 } }
2.表达式的自动类型转换
在表达式中,小范围类型的变量会自动转换成当前较大范围的类型再运算。
public static void main(String[] args) { byte a=10; int b=20; double c=1.0; double sum=a+b+c; System.out.println(sum); byte i=100; byte j=120; int k=i+j; System.out.println(k); }
之所以 2个byte类型相加是int类型,是因为2个byte类型相加后 其值可能会越界 所以用
int来接收
注意事项:
表达式的最终结果类型由表达式中的 最高类型决定。
在表达式中, byte 、 short 、 char 是 直接转换成 int 类型参与运算的。
3.强制类型转换
场景:
问题
类型范围大的数据或者变量,不能直接赋值给类型范围小的变量,会报错。
强制类型转换
可以强行将类型范围大的变量、数据赋值给类型范围小的变量。
强制类型转换底层原理
注意事项
强制类型转换可能造成数据(丢失)溢出;
浮点型强转成整型,直接丢掉小数部分,保留整数部分返回。
🥦运算符
1.基本算数运算符
运算符
运算符:对字面量或者变量进行操作的 符号。
算数运算符
案例:数值拆分
需求:一个三位数,将其拆分为个位、十位、百位后,打印在控制台
公式总结:
个位 :数值 % 10
十位 :数值 / 10 % 10
百位 :数值 / 10 / 10 % 10
千位 :数值 / 10 / 10 / 10 % 10;
...
2.+符号做连接符
“+” 做连接符
“+”符号与字符串运算的时候是用作连接符的,其结果依然是一个字符串。
public static void main(String[] args) { int a = 5 ; System.out.println("abc"+'a');// abca System.out.println("abc" + a); // abc5 System.out.println(5 + a); // 10 System.out.println("abc" + 5 + 'a'); System.out.println(15 + "abc" + 15); System.out.println(a + 'a'); System.out.println(a + "" +'a'); System.out.println(a + 'a'+"itheima"); System.out.println("itheima"+ a + 'a'); System.out.println("itheima"+ ( a + 'a' )); }
3.自增自减运算符
自增自减运算符
注意:
++ 和 -- 既可以放在变量的后边,也可以放在变量的前边。
++ 、-- 只能操作变量,不能操作字面量的。
自增自减的使用注意事项
++、--如果不是单独使用(如在表达式中、或者同时有其它操作),放在变量前后会存在明显区别
放在变量的前面,先对变量进行+1、-1,再拿变量的值进行运算。
int a = 10; int rs = ++a;
放在变量的后面,先拿变量的值进行运算,再对变量的值进行+1、-1
int b = 10; int rs = b++;
4.赋值运算符
基本赋值运算符
就是“=”。
int a = 10; // 先看“=”右边,把数据10赋值给左边的变量a存储。
扩展赋值运算符
符号 作用 说明
+= 加后赋值 a+=b 等价于 a = (a的数据类型)(a+b); 将a + b的值给a
-= 减后赋值 a-=b 等价于 a = (a的数据类型)(a-b); 将a - b的值给a
*= 乘后赋值 a*=b 等价于 a = (a的数据类型)(a*b); 将a * b的值给a
/= 除后赋值 a/=b 等价于 a = (a的数据类型)(a/b); 将a / b的商给a
%= 取余后赋值 a%=b 等价于 a = (a的数据类型)(a%b); 将a % b的商给a
注意:扩展的赋值运算符隐含了强制类型转换。
5.关系运算符
关系运算符
是对数据进行条件判断的符号,最终会返回一个比较的布尔结果(false,true)。
符号 说明
== a==b,判断a和b的值是否相等,成立为true,不成立为false
!= a!=b,判断a和b的值是否不相等,成立为true,不成立为false
>
a>b, 判断a是否大于b,成立为true,不成立为false
>= a>=b,判断a是否大于等于b,成立为true,不成立为false
< a
<= a<=b,判断a是否小于等于b,成立为true,不成立为false
注意:在做相等判断是,千万不要把 == 误写成 =
6.逻辑运算符
逻辑运算符概述
可以把多个条件的布尔结果放在一起运算,最终返回一个布尔结果。
符号 介绍 说明
& 逻辑与 必须都是true,结果才是true; 只要有一个是false,结果一定是false。
| 逻辑或 只要有一个为true、结果就是true
! 逻辑非 你真我假、你假我真。 !true=false 、 !false= true
^ 逻辑异或 如果两个条件都是false或者都是true则结果是false。两个条件不同结果是true。
&& 短路与
判断结果与“&”一样。过程是 左边为 false ,右边则不执行。
|| 短路或 判断结果与“|”一样。过程是左边为 true, 右边则不执行。
注意:逻辑与 “&” 、 逻辑或“ |”: 无论左边是 false还是 true, 右边都要执行。
7.三元运算符
三元运算符介绍
格式:条件表达式 ? 值1 : 值2;
执行流程:首先计算 关系表达式的值, 如果值为 true ,返回 值1 ,如果为 false ,返回 值2。
案例:求三个整数的最大值
需求:定义三个整数,找最大值并打印在控制台。
分析:
① 用三元运算符获取前两个整数的最大值,并用临时变量保存起来。
num1 > num2 ? num1 : num2;
② 用三元运算符,让临时最大值,和第三个整数,进行比较,并记录结果。
temp > num3 ? temp : num3;
③ 输出结果
8.运算符优先级
运算符优先级
在表达式中,哪个运算符先执行后执行是要看优先级的,例如 “*、/” 的优先级高于”+、-”。
运算符优先级
// 目标:看看Java是否存在优先级,大家以后需要注意优先级问题 System.out.println(10 > 3 || 10 > 3 && 10 < 3); // true System.out.println( (10 > 3 || 10 > 3 ) && 10 < 3); // false
🍒程序流程控制
流程控制语句
Java提供了一些流程控制语句,来 控制程序 的 执行流程
如果你没有写其他的结构,按照代码的先后顺序,依次执行程序中大多数的代码都是这样执行的。
分支结构
If分支
根据判定的结果(真或假)决定执行某个分支的代码
If分支有三种格式
格式1: if (条件表达式) { 语句体; } 格式2: if (条件表达式) { 语句体1; } else { 语句体2; } 格式3: if (条件表达式1) { 语句体1; } else if (条件表达式2) { 语句体2; } else if (条件表达式3) { 语句体3; } . . . else { 语句体n+1; }
if 第一种格式
的结果,如果为true执行语句体,为 false 就不执行语句体。
注意事项:
if 语句中,如果大括号控制的只有一行代码,则大括号可以省略不写。
if 第二种格式
执行流程:
① 首先判断条件表达式的结果,如果为true执行语句体1,为 false 就执行语句体2。
if 第三种格式
格式:
if (条件1) {
语句体1;
} else if (条件2) {
语句体2;
} else if (条件3) {
语句体4;
}
. . .
else {
语句体n+1;
}
执行流程:
① 先 判断条件 1 的值,如果为 true 则执行语句体 1 ,分支结束;如果为 false 则 判断条件 2 的值
② 如果值为 true 就执行语句体 2 ,分支结束;如果为 false 则 判断条件 3 的值
③ ...
④ 如果没有任何条件为 true ,就执行 else 分支的语句体 n+1 。
switch分支
也是匹配条件去执行分支 , 适合做值匹配的分支选择,结构清晰,格式良好 。
switch(表达式){ case 值1: 执行代码...; break; case 值2: 执行代码...; break; … case 值n-1: 执行代码...; break; default: 执行代码n; }
执行流程:
① 先执行表达式的值,拿着这个值去与 case 后的值进行匹配。
② 匹配哪个 case 的值为 true 就执行哪个 case ,遇到 break 就跳出 switch 分支。
③ 如果 case 后的值都不匹配则执行 default 代码。
switch案例
周一:埋头苦干,解决 bug
周二:请求大牛程序员帮忙
周三:今晚啤酒、龙虾、小烧烤
周四: 主动帮助新来的女程序解决 bug
周五:今晚吃鸡
周六:与王婆介绍的小芳相亲
周日:郁郁寡欢、准备上班。
switch分支注意事项:
① 表达式类型 只能是byte、short、int、char ,JDK5开始支持枚举,JDK7开始支持String、
不支持double、float、long 。
② case给出的值不允许重复,且只能是字面量,不能是变量。
③ 不要忘记写break,否则会出现穿透现象。
switch的穿透性
如果代码执行到没有写 break 的 case 块 ,执行完后将直接进入下一个 case 块执行代码( 而且不会进行任何匹配 ),直到遇到break 才跳出分支,这就是 switch 的穿透性。
循环结构
for 循环
控制一段代码反复执行很多次。
格式:
for ( 初始化语句 ; 循环条件 ; 迭代语句 ) {
循环体语句 ( 重复执行的代码 );
}
// 输出3次HelloWorld for (int i = 0; i < 3; i++) { System.out.println("Hello World"); }
for 循环案例详细流程说明
执行的流程:
① 循环一开始,执行int i = 0 一次。
② 然后判断循环条件:0 < 3 返回true ,进入到循环体中执行输出 :helloWorld ,然后执行迭代语句i++ , 此时i=1了。
③ 然后判断循环条件:1 < 3 返回true ,进入到循环体中执行输出 :helloWorld ,然后执行迭代语句i++ , 此时i=2了。
④ 然后判断循环条件:2 < 3 返回true ,进入到循环体中执行输出 :helloWorld, 然后执行迭代语句i++ , 此时i=3了。
⑤ 然后判断循环条件:3 < 3 返回false, 循环立即结束!!
while循环
while 循环格式与执行流程
初始化语句;
while ( 循环条件 ) {
循环体语句 ( 被重复执行的代码 );
迭代语句 ;
}
示例
int i = 0; while (i < 3) { System.out.println("Hello World"); i++; }
do-while循环
先执行再判断循环条件。
初始化语句 ;
do {
循环体语句 ;
迭代语句 ;
} while ( 循环条件 );
示例
int i = 0; do { System.out.println(“Hello World!"); i++; } while( i < 3);
do-while循环的特点:一定会先执行一次循环体。
三种循环的区别
for循环 和 while循环(先判断后执行)
do...while (第一次先执行后判断)
for 和 while 的区别:
for循环和while循环的执行流程是一模一样的。
如果已知循环次数建议使用for循环,如果不清楚要循环多少次建议使用while循环。
for循环中,控制循环的变量只在循环中可以使用。While循环中,控制循环的变量在循环后还可以继续使用。
死循环
一直循环的执行下去,如果没有干预不会停止下来。
写法
for(;;) { System.out.println("Hello World"); } // 经典做法 while(true) { System.out.println("Hello World"); } do { System.out.println("Hello World"); } while (true);
循环嵌套
循环中又包含循环
嵌套循环的特点
外部循环每循环一次,内部循环全部执行完一次。
跳转关键字:break、continue
跳转控制语句介绍
break : 跳出并结束当前所在循环的执行。
continue: 用于跳出当前循环的当次执行,进入下一次循环。
注意事项
break : 只能用于结束所在循环 , 或者结束所在 switch 分支的执行。
continue : 只能在循环中进行使用。
案例技术:随机数Random类
Random 随机数技术
作用:用于在程序中获取随机数的技术。
Random生成随机数的特点
nextInt(n)功能只能生成:0 – (n-1)之间的随机数。
Random生成区间随机数的技巧:减加法。
例如:要生成 1 – 10之间的随机数,程序怎么实现?
案例 :猜数字游戏
需求:
随机生成一个 1-100 之间的数据,提示用户猜测,猜大提示过大,猜小提示过小,直到猜中结束游戏。
分析:
随机生成一个 1-100 之间的数据
使用死循环让用户不断提示用户猜测,猜大提示过大,猜小提示过小,猜中结束游戏。
import java.util.Random; import java.util.Scanner; public class base { public static void main(String[] args) { // 需求: // 随机生成一个1-100之间的数据,提示用户猜测,猜大提示过大,猜小提示过小,直到猜中结束游戏。 // 分析: // 随机生成一个1-100之间的数据 // 使用死循环让用户不断提示用户猜测,猜大提示过大,猜小提示过小,猜中结束游戏。 Random random = new Random(); int number=random.nextInt(100)+1; System.out.println("随机生成一个1-100之间的数据,请输入你猜测的数字:"); Scanner num = new Scanner(System.in); boolean flag=true; while (flag){ int i = num.nextInt(); if (i>number){ System.out.println("猜大了"); } else if (i<number){ System.out.println("猜小了"); } else { System.out.println("恭喜猜对了"); flag=false; } } } }