运算符
1.隐式转换和强制转换
类型转换的分类 1.隐式转换: 取值范围小的数值 转换为 取值范围大的数值 2.强制转换: 取值范围大的数值 转换为 取值范围小的数值隐式转换的两种提升规则 取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算 byte short char 三种类型的数据在运算的时候,都会直接先提升为 int,然后再进行运算byte => intint => long => float => doubleshort => int
// 判断结果的数据类型: // byte b1 = 10; // byte b2 = 20; // result = b1 + b2; // 数据类型 int // // int i = 10; // long n = 100L; // double d = 20.0; // result = i + n + d; // 数据类型 double // // byte b = 10; // short s = 20; // long n = 100L; // result = b + s + n; // 数据类型 long
强制转换 如果把一个取值范围大的数值,赋值给取值范围小的变量。是不允许直接赋值的。如果一定要这么做就需要加入强制转换。 格式:目标数据类型 变量名 =(目标数据类型) 被强转的数据;
// 范例:double a = 12.3;int b = (int) a;byte b1 = 100;byte b2 = 100;byte result = (byte)(b1 + b2);System.out.println(result);// -56 结果就发生错误了 因为要转换的数据过大
2.字符串和字符的加操作
字符串的 “+” 操作 当 “+” 操作中出现字符串时,这个 “+” 是字符串连接符,而不是算术运算符了。会将前后的数据进行拼接,并产生一个新的字符串。 “123” + 123 结果为 “123123” 连续进行 “+” 操作时,从左到右逐个执行。 1 + 99 + “年黑马” 结果为 “100 年黑马”
// 当 字符+字符 或 字符+数字 时,会把字符通过 ASCII 码表查询到对应的数字再进行计算。System.out.println(1 + 'a'); //98System.out.println('a' + 'c'); //196System.out.println('a' + "abc"); //aabc
3.自增自减运算符
// 单独使用: ++ 和 -- 无论是放在变量的前边还是后边,单独写一行结果是一样的。 // 参与计算: // 先用后加int a = 10;int b = a++; // 先加后用int a = 10;int b = ++a;
4.赋值运算符和关系运算符
赋值运算符符号 作用 说明= 赋值 int a = 10,将 10 赋值给变量 a+= 加后赋值 a += b,将 a + b 的值给 a-= 减后赋值 a -= b,将 a - b 的值给 a*= 乘后赋值 a *= b,将 a × b 的值给 a/= 除后赋值 a /= b,将 a ÷ b 的商给 a%= 取余后赋值 a %= b,将 a ÷ b 的余数给 a关系运算符符号 说明== 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<b,判断 a 是否小于 b,成立为 true,不成立为 false<= a<=b,判断 a 是否小于等于 b,成立为 true,不成立为 false
5.四种逻辑运算符和两个短路逻辑运算符
符号 作用 说明& 逻辑与(且) 并且,两边都为真,结果才是真| 逻辑或 或者,两边都为假,结果才是假^ 逻辑异或 相同为 false,不同为 true! 逻辑非 取反&& 短路与 结果和 & 相同,但是有短路效果|| 短路或 结果和 | 相同,但是有短路效果
6.三元运算符和运算符的优先级
(三元运算符 / 三元表达式) 格式格式:关系表达式? 表达式1: 表达式2;
// 范例:求两个数的较大值int max = a > b ? a : b;System.out.println(a > b ? a : b);
计算规则首先计算关系表达式的值如果值为 true,表达式 1 的值就是运算结果如果值为 false,表达式 2 的值就是运算结果小括号()的优先级最高
判断和循环
1.顺序结构
// 顺序结构语句是 Java 程序默认的执行流程,按照代码的先后顺序,从上到下依次执行System.out.println("努力做主人喜欢的事");System.out.println("大小姐驾到!统统闪开!");System.out.println("凛冬已至,故乡的梅花开了吗");System.out.println("心怀不惧,方能翱翔于天际");
2.分支结构if
if格式if(关系表达式){语句体;}if 的注意点:大括号的开头可以另起一行书写,但是建议写在第一行的末尾在语句体中,如果只有一句代码,大括号可以省略不写如果对一个布尔类型的变量进行判断,不要用 == 号if (关系表达式) {语句体1;} else {语句体2;}执行流程:I. 首先计算关系表达式的值II. 如果关系表达式的值为 true 就执行语句体 1III. 如果关系表达式的值为 false 就执行语句体 2IV. 继续执行后面的其他语句if (关系表达式1) {语句体1;} else if (关系表达式2) {语句体2;}...else {语句体 n + 1;}执行流程:I. 首先计算关系表达式 1 的值II. 如果为 true 就执行语句体 1;如果为 false 就计算关系表达式 2 的值III. 如果为 true 就执行语句体 2;如果为 false 就计算关系表达式 3 的值IV. ……V. 如果所有关系表达式结果都为 false,就执行语句体 n+1
3.分支结构switch
switch(表达式) {case 值1:语句体1;break;case 值2:语句体2;break;...default:语句体n+1;break;}执行流程:I. 首先计算表达式的值。II. 依次和 case 后面的值进行比较,如果有对应的值,就会执行相应的语句,在执行的过程中,遇到 break 就会结束。III. 如果所有的 case 后面的值和表达式的值都不匹配,就会执行 default 里面的语句体,然后结束整个 switch 语句。default 的位置和省略位置:default 不一定是写在最下面的,我们可以写在任意位置。只不过习惯会写在最下面省略:default 可以省略,语法不会有问题,但是不建议省略。case 穿透就是语句体中没有写 break 导致的。执行流程:首先还是会拿着小括号中表达式的值跟下面每一个 case 进行匹配。如果匹配上了,就会执行对应的语句体,如果此时发现了 break,那么结束整个 switch 语句。如果没有发现 break,那么程序会继续执行下一个 case 的语句体,一直遇到 break 或者右大括号为止使用场景:如果多个 case 的语句体重复了,那么我们考虑利用 case 穿透去简化代码。
// 用箭头简写int number = 1;switch (number){case 1 -> {System.out.println("一");break;}case 2 -> {System.out.println("二");break;}case 3 -> {System.out.println("三");break;}default -> {System.out.println("没有这种选项");break;}}
// 省略大括号switch (number){case 1 -> System.out.println("一");case 2 -> System.out.println("二");case 3 -> System.out.println("三");default -> System.out.println("没有这种选项");}
4.循环语句for
格式:for (初始化语句 ;条件判断语句 ;条件控制语句) {循环体语句;}执行流程: ① 执行初始化语句 ② 执行条件判断语句,看其结果是 true 还是 false如果是 false,循环结束如果是 true,执行循环体语句 ③ 执行条件控制语句 ④ 回到②继续执行条件判断语句
5.循环语句while
初始化语句;while(条件判断语句){循环体语句;条件控制语句;}for 和 while 的区别:for 循环中,控制循环的变量,因为归属 for 循环的语法结构中,在 for 循环结束后,就不能再次被访问到了while 循环中,控制循环的变量,对于 while 循环来说不归属其语法结构中,在 while 循环结束后,该变量还可以继续使用
循环高级综合练习
1.无限循环和跳转控制语句
//for格式的无限循环 for(;;){System.out.println("学习"); }
//while格式的无限循环 while(true){System.out.println("学习"); }
注意事项 无限循环的下面不能再写其他代码了,因为循环永远停不下来,那么下面的代码永远执行不到
//1.continue跳过某一次循环 for (int i = 1; i <= 5; i++) {if(i == 3){//结束本次循环,继续下次循环continue;}System.out.println("小老虎在吃第" + i + "个包子"); } //2.结束整个循环 for (int i = 1; i <= 5; i++) {if(i == 3){//结束整个循环break;}System.out.println("小老虎在吃第" + i + "个包子");
数组
1.数组的概述和静态初始化
数组:是一种容器,可以用来存储同种数据类型的多个值数组容器在存储数据的时候,需要结合隐式转换考虑格式一:数据类型 [] 数组名范例:int [] array格式二:数据类型 数组名 []范例:int array[]数组的初始化初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程。数组初始化的两种方式1.静态初始化2.动态初始化数组的静态初始化初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程完整格式:数据类型 [] 数组名 = new 数据类型 []{元素1,元素2,元素3...};范例:int [] array = new int []{11, 22, 33};范例:double [] array2 = new double []{11.1, 22.2, 33.3};简化格式:数据类型 [] 数组名 = {元素1,元素2,元素3...};范例:int [] array = {11, 22, 33};范例:double [] array2 = {11.1, 22.2, 33.3};
//需求1:定义数组存储5个学生的年龄int[] arr1 = new int[]{11,12,13,14,15};int[] arr2 = {11,12,13,14,15};//需求2:定义数组存储3个学生的姓名String[] arr3 = new String[]{"zhangsan","lisi","wangwu"};String[] arr4 = {"zhangsan","lisi","wangwu"};//需求3:定义数组存储4个学生的身高 1.93double[] arr5 = new double[]{1.93,1.75,1.73,1.81};double[] arr6 = {1.93,1.75,1.73,1.81};
2.数组的地址值和元素访问
double[] arr6 = {1.93,1.75,1.73,1.81}; System.out.println(arr6);//[D@23fc625e 地址值 扩展: 解释一下地址值的格式含义 [D@23fc625e [ :表示当前是一个数组 D:表示当前数组里面的元素都是double类型的 @:表示一个间隔符号。(固定格式) 23fc625e:才是数组真正的地址值,(十六进制)平时我们习惯性的会把这个整体叫做数组的地址值
数组元素访问 格式:数组名[索引]; 索引:也叫做下标,角标。 索引的特点:从 0 开始,逐个 + 1 增长,连续不间断利用索引对数组中的元素进行访问 1.获取数组里面的元素 格式: 数组名[索引]
int[] arr = {1,2,3,4,5}; //获取数组中的第一个元素 //其实就是0索引上对应的元素 int number = arr[0]; System.out.println(number);//1 //获取数组中1索引上对应的数据,并直接打印出来 System.out.println(arr[1]);//2//2.把数据存储到数组当中 //格式: 数组名[索引] = 具体数据/变量; arr[0] = 100; System.out.println(arr[0]);//100
3.数组的遍历
int[] arr = {1,2,3,4,5}; 在Java当中,关于数组的一个长度属性,length 调用方式:数组名.lengthSystem.out.println(arr.length);for (int i = 0; i < arr.length; i++) {//i: 0 1 2 3 4System.out.println(arr[i]);}扩展: 自动的快速生成数组的遍历方式 idea提供的 数组名.fori
4.数组的动态初始化和常见问题
数组动态初始化动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。格式:数据类型[] 数组名 = new 数据类型[数组长度];范例:int[] arr = new int[3];
//在创建的时候,由我们自己指定数组的长度,由虚拟机给出默认的初始化值String[] arr = new String[50]; //添加学生arr[0] = "zhangsan";arr[1] = "lisi"; //获取System.out.println(arr[0]);//zhangsanSystem.out.println(arr[1]);//lisiSystem.out.println(arr[2]);//打印出来的是默认初始化值null
数组默认初始化值的规律 整数类型:默认初始化值0 小数类型:默认初始化值0.0 字符类型:默认初始化值'\u0000' 空格 布尔类型:默认初始化值 false 引用数据类型:默认初始化值 null
int[] arr2 = new int[3]; System.out.println(arr2[0]);//0 System.out.println(arr2[1]);//0 System.out.println(arr2[2]);//0
数组动态初始化和静态初始化的区别 动态初始化:手动指定数组长度,由系统给出默认初始化值。 只明确元素个数,不明确具体数值,推荐使用动态初始化 静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组的长度。 需求中已经明确了要操作的具体数据,直接静态初始化即可。
数组常见问题当访问了数组中不存在的索引,就会引发索引越界异常。
5.数组的内存圈
Java 内存分配 栈:方法运行时使用的内存,比如 main 方法运行,进入方法栈中执行 堆:存储对象或者数组,new 来创建的,都存储在堆内存 方法区:存储可以运行的 class 文件 本地方法栈:JVM 在使用操作系统功能的时候使用,和我们开发无关 寄存器:给 CPU 使用,和我们开发无关
方法
1.什么是方法
什么是方法?方法是程序中最小的执行单元实际开发中,什么时候用到方法?重复的代码、具有独立功能的代码可以抽取到方法中实际开发中,方法有什么好处?可以提高代码的复用性可以提高代码的可维护性
2.最简单的方法定义和调用
方法定义格式public static void 方法名 (){方法体(就是打包起来的代码);}范例public static void playGame (){七个打印语句;}方法调用格式方法名();范例playGame();注意:方法必须先定义后调用,否则程序将报错
//定义一个方法 public static void playGame(){System.out.println("选人物");System.out.println("准备开局");System.out.println("对线");System.out.println("崩盘");System.out.println("骂队友");System.out.println("送人头");System.out.println("GG"); }
//调用方法 playGame();
3.带参数的方法定义和调用
带参数的方法定义单个参数格式:public static void 方法名(参数){......}范例:public static void method(int number){......}多个参数格式:public static void 方法名(参数1, 参数2, ......){......}范例:public static void getSum(int number1, int number2){......}带参数的方法调用单个参数单个参数:方法名(参数);范例 1:method(10);范例 2:method(变量);多个参数多个参数:方法名(参数1, 参数2, ……);范例 1:getSum(10,20);范例 2:getSum(变量1, 变量2);
public static void main(String[] args) {getSum(10,20);}public static void getSum(int num1, int num2){int result = num1 + num2;System.out.println(result);}
形参和实参形参:全称形式参数,是指方法定义中的参数实参:全称实际参数,方法调用中的参数注意:方法调用时,形参和实参必须一一对应,否则程序将报错。
4.带返回值方法的定义和调用
方法的返回值其实就是方法运行的最终结果如果在调用处要根据方法的结果,去编写另外一段代码逻辑为了在调用处拿到方法产生的结果,就需要定义带有返回值的方法带返回值方法定义格式public static 返回值类型 方法名(参数) {方法体;return 返回值;}范例public static int getSum(int a, int b) {int c = a + b;return c;}带返回值方法的调用直接调用:方法名 (实参);赋值调用:整数类型 变量名 = 方法名 (实参);输出调用:System.out.println (方法名 (实参));
return 关键字方法没有返回值:可以省略不写。如果书写,表示结束方法方法有返回值:必须要写。表示结束方法和返回结果
5.方法的重载
方法的重载在同一个类中,定义了多个同名的方法,这些同名的方法具有同种的功能。每个方法具有不同的参数类型或参数个数,这些同名的方法,就构成了重载关系简单记:同一个类中,方法名相同,参数不同的方法。与返回值无关。参数不同:个数不同、类型不同、顺序不同