Java学习笔记之Java基础语法
0x00 概述
本篇涉及Java基础知识有基本运算符,数据输入,流程控制语句。
0x01 运算符
1.1 算术运算符
1.1.1 运算符和表达式
运算符:对常量或者变量进行操作的符号。
表达式:用运算符把常量或者变量连接起来符合Java语法的式子就可以成为表达式。
不同运算符连接的表达式体现的是不同类型的表达式。
举例说明:
int a = 10; int b = 20; int c = a + b;
+:是运算符,并且是算术运算符。
a + b:是表达式,由于+是算术运算符,所以这个表达式叫算术表达式。
1.1.2 算术运算符
注意:
// /和%的区别:两个数据做除法,/取结果的商,%取结果的余数。 // 整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。
int a = 10; int b = 3; System.out.println(a / b); System.out.println(a % b);
1.1.3 字符的“+”操作
char类型参与算术运算,使用的是计算机底层对应的十进制数值。需要我们记住三个字符对应的数值:
'a' -- 97 a-z是连续的,所以'b'对应的数值是98,'c'是99,依次递加;
'A' -- 65 A-Z是连续的,所以'B'对应的数值是66,'C'是67,依次递加 '0' -- 48 0-9是连续的,所以'1'对应的数值是49,'2'是50,依次递加;
// 可以通过使用字符与整数做算术运算,得出字符对应的数值是多少 char ch1 = 'a'; System.out.println(ch1 + 1); // 输出98, 97 + 1 =98 char ch2 = 'A'; System.out.println(ch2 + 1); // 输出66, 65 + 1 = 66 char ch3 = '0'; System.out.println(ch3 + 1); //输出49, 48 + 1 = 49
算术表达式中包含不同的基本数据类型的值的时候,整个算术表达式的类型会自动进行提升。
提升规则:
// byte类型,short类型和char类型将被提升到int类型,不管是否有其他类型参与运算。 // 整个表达式的类型自动提升到与表达式中最高等级的操作数相同的类型等级顺序:byte,short,char --> int --> long --> float --> double 例
如:
byte b1 = 10; byte b2 = 20; // byte b3 = b1 + b2; //该行报错,因为byte类型参与算术运算会自动提升为int,结果int再次赋值给byte可能会损失数据精度 int i3 = b1 + b2; byte b3 = (byte)(b1 + b2); // 或者将结果强制转换为byte类型 ----------------------------------- int num1 = 10; double num2 = 20.0; double num3 = num1 + num2; // 使用double接收,因为num1会自动提升为double类型
ips:正是由于上述原因,所以在程序开发中我们很少使用byte或者short类型定义整数。也很少会使用char类型定义字符,
而使用字符串类型,更不会使用char类型做算术运算。
1.1.4 字符串的“+”操作
“+”操作中出现字符串时,这个”+”是字符串连接符,而不是算术运算。
System.out.println("itheima"+ 666); // 输出为itheima666
在”+”操作中,如果出现了字符串,就是连接运算符,否则就是算术运算。当连续进行“+”操作时,从左到右逐个执行。
System.out.println(1 + 99 + "年黑马"); // 输出:199年黑马 System.out.println(1 + 2 + "itheima" + 3 + 4); // 输出:3itheima34 // 可以使用小括号改变运算的优先级 System.out.println(1 + 2 + "itheima" + (3 + 4)); // 输出:3itheima7
1.2 赋值运算符
赋值运算符的作用是将一个表达式的值赋给左边,左边必须是可修改的,不能是常量。
注意:扩展的赋值运算符隐含了强制类型转换。
short s = 10; s = s + 10; // 此行代码报错,因为运算中s被提升为乐int类型,运算结果int赋值给short可能会损失精度 s += 10; // 此行代码没有问题,隐含了强制类型转换,相当于 s = (short)(s+10);
1.3 自增自减运算符
注意事项:
/* ++和-- 既可以放在变量的后边,也可以放在变量的前边。 单独使用的时候, ++和-- 无论是放在变量的前边还是后边,结果是一样的。 参与操作的时候,如果放在变量的后边,先拿变量参与操作,后拿变量做++或者--。
参与操作的时候,如果放在变量的前边,先拿变量做++或者--,后拿变量参与操作。
最常见的用法:单独使用。 */
练习:
int i = 10; i ++ ; System.out.println("i:" + i); // i:11 int j = 10; ++j; //单独使用 System.out.println("j:" + j); // j:11 int x = 10; int y = x ++; // 赋值运算,++在后边,所以是使用x原来的值赋值给y,x本身自增1 System.out.println("x:" + x + ", y:" + y); //x:11, y:10 int m = 10; int n = ++m; System.out.println("m:" + m + ", n:" + n); // m:11, n:11
练习:
int x = 10; int y = x++ + x++ + x++; System.out.println(y); //y的值为多少? /* 解析: 三个表达式都是在++放在x后面,所以每次使用的都是自增前的值,但程序自左至右依次执行,所以第一次自增时,使用的是10进行计算,第二次自增时,x的值已经是11,所以第二次使用的是11,然后再次自增。。。 所以整个式子应该是: int y = 10 + 11 + 12; 输出结果为33 */
1.4 关系运算符
关系运算符有6种关系,分别为小于、小于等于、大于、等于、大于等于、不等于。
注意事项:
// 关系运算符的结果都是boolean类型,要么是true,要么是false。千万不要把“==”误写成“=”,"=="是判断是否相等的关系,"="是赋值。
int a = 10; int b = 20; System.out.println(a == b); // false System.out.println(a != b); // true System.out.println(a > b); // false System.out.println(a >= b); // false System.out.println(a < b); // true System.out.println(a <= b); // true // 关系运算的结果肯定是boolean类型,所以也可以将运算结果赋值给boolean类型的变量 boolean flag = a > b; System.out.println(flag); // 输出为false
1.5 逻辑运算符
逻辑运算符把各个运算的关系表达式连接起来组成一个复杂的逻辑表达式,以判断程序中的表达式是否成立,判断的结果是 true 或 false。
// 定义变量 int i = 10; int j = 20; int k = 30; // & "与",并且的关系,只要表达式中有一个值为false,结果即为false System.out.println((i > j) & (i > k)); // false & false, false System.out.println((i < j) & (j > k)); // true & false, false System.out.println((i > j) & (i < k)); // false & true, false System.out.println((i < j) & (i < k)); // true & true, true System.out.println("-------------------------------------"); // | "或",或者的关系,只要表达式中有一个值为true,结果即为true System.out.println((i > j) & (i > k)); // false | false, false System.out.println((i < j) & (j > k)); // true | false, true System.out.println((i > j) & (i < k)); // false | true, true System.out.println((i < j) & (i < k)); // true | true, true System.out.println("-------------------------------------"); // ^ "异或",相同为false,不同为true System.out.println((i > j) & (i > k)); // false | false, false System.out.println((i < j) & (j > k)); // true | false, true System.out.println((i > j) & (i < k)); // false | true, true System.out.println((i < j) & (i < k)); // true | true, false System.out.println("-------------------------------------"); // ! "非",取反 System.out.println((i > j)); //false System.out.println(^(i > j)); // ture
短路逻辑运算符
在逻辑与运算中,只要有一个表达式的值为false,那么结果就可以判定为false了,
没有必要将所有表达式的值都计算出来,短路与操作就有这样的效果,可以提高效率。
同理在逻辑或运算中,一旦发现值为true,右边的表达式将不再参与运算。
/* 1. 逻辑与&, 无论左边真假,右边都要执行; 2. 短路与&&,如果左边为真,右边继续执行;如果左边为假,右边不执行; 3. 逻辑或|, 无论左边真假,右边都要执行; 4. 短路或||,如果左边为假,右边执行;如果左边为真,右边不执行; */
int x = 3; int y = 4; System.out.println((x++ > 4) & (y++ >5)); //两个表达式都会运算 System.out.println(x); // 4 System.out.println(y); // 5 System.out.println((x++ >4) && (y++ >5)); //左边结果为false,右边不在参与计算 System.out.println(x); // 4 System.out.println(y); // 4
1.6 三元运算符
三元运算符语法格式:
关系表达式? 表达式1 : 表达式2;
解释:问号前面的位置是判断的条件,判断结果为boolean型,为true时调用表达式1,为false时调用表达式2。
其逻辑为:如果条件表达式成立或者满足则执行表达式1,否则执行第二个。
举例:
int a = 10; int b = 20; int c = a > b ? a : b. //判断a>b是否为真,如果为真,返回a的值,如果为假,返回b的值
三元运算符案例:
1. 需求:动物园里有两只老虎,已知两只老虎的体重分别为180kg、200kg,请用程序实现判断两只老虎的体重是否相同
public class operatortest01 { public static void main(String[] args) throws Exception { // 1. 定义两个变量用于保存老虎的体重,单位kg,这里只体现数值 int weight1 = 180; int weight2 = 200; // 2. 用三元运算符实现老虎体重的判断,体重相同,返回true;否则返回false boolean b = weight1 == weight2 ? true : false; // 3. 输出结果 System.out.println("b: " +b); } }
2. 需求:一座寺庙里住着三个和尚,已知他们的身高分别为150cm、210cm、165cm,请用程序实现获取这三个和尚的最高身高。
public class operatortest02 { public static void main(String[] args) { // 1. 定义3个变量保存和尚身高,单位cm,这里仅仅天数值即可 int height1 = 150; int height2 = 210; int height3 = 165; // 2. 用三元运算符获取前两个和尚的较高身高,并用临时身高变量保存起来 int tempHeight = height1 > height2 ? height1 : height2; // 3. 用三元运算符获取临时身高值和第三个和尚比较结果,并用最大身高变量保存 int maxHeight = tempHeight > height3 ? tempHeight : height3; // 4. 输出结果 System.out.println("maxHeight: " + maxHeight); } }
0x02 数据输入
我们可以通过 Scanner 类来获取用户的输入。使用步骤如下:
1. 导包。Scanner 类在java.util包下,所以需要将该类导入。导包的语句需要定义在类的上面。
import java.util.Scanner;
2. 创建Scanner对象。
// 创建Scanner对象,sc表示变量名,其他均不可 Scanner sc = new Scanner(System.in);
3. 接收数据。
int i = sc.nextInt(); //表示将键盘录入的值作为int数据类型返回
示例:
import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int x = sc.nextInt(); System.out.println("x: " + x); } }
改写三个和尚案例,数据使用键盘录入。
import java.util.Scanner; public class threemonks { public static void Main(String[] args) { // 身高未知,采用键盘录入。首先导包,然后创建对象 Scanner sc = new Scanner(System.in); // 键盘录入三个身高,分别赋值给三个变量 System.out.println("第一个和尚的身高: "); int height1 = sc.nextInt(); System.out.println("第二个和尚的身高: "); int height2 = sc.nextInt(); System.out.println("第三个和尚的身高: "); int height3 = sc.nextInt(); // 用三元运算符获取前两个和尚的较高身高,并用临时身高变量保存起来 int tempHeight = height1 > height2 ? height1 : height2; // 用三元运算符获取临时身高和第三个和尚身高较高值,并用最大身高变量保存 int maxHeight = tempHeight > height3 ? tempHeight : height3; System.out.println("这三个和尚中身高最高的是: " + maxHeight + "cm"); } }
0x03 流程控制语句
在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。
所以,我们必须清楚每条语句的执行流程。而且,很多时候要通过控制语句的执行顺序来实现我们想要的功能。
3.1 流程控制语句分类
顺序结构
分支结构(if, switch)
循环结构(for, while, do…while)
3.2 顺序结构
顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。
顺序结构执行流程图:
3.3 分支结构之if语句
3.3.1 if语句格式1
if (关系表达式) { 语句体; }
执行流程:
①首先计算关系表达式的值
②如果关系表达式的值为true就执行语句体
③如果关系表达式的值为false就不执行语句体
④继续执行后面的语句内容
示例:
public class ifdemo { public static void main(String[] args) { System.out.println("开始!~"); int a = 10; int b = 20; if(a == b) { System.out.println("a等于b"); } int c = 10; if(a == c) { System.out.println("a等于c"); } System.out.println("结束"); } }
3.3.2 if语句格式2
if (关系表达式) { 语句体1; } else { 语句体2; }
执行流程:
①首先计算关系表达式的值
②如果关系表达式的值为true就执行语句体1
③如果关系表达式的值为false就执行语句体2
④继续执行后面的语句内容
示例:
public class ifdemo2 { public static void main(String[] args) { System.out.println("开始"); // 定义两个变量 int a = 10; int b = 20; // 需求: 判断啊是否大于b;如果a大于b,则输出a大于b;如果a小于b,则输出a小于b if(a > b) { System.out.println("a的值大于b"); } else { System.out.println("a的值小于b"); } System.out.println("结束"); } }
3.3.3 if语句案例2:奇偶数
需求:任意给出一个整数,请用程序实现判断该整数是奇数还是偶数,并在控制台输出该整数是奇数还是偶数。
分析:
①为了体现任意给出一个整数,采用键盘录入一个数据
②判断整数是偶数还是奇数要分两种情况进行判断,使用if..else结构
③判断是否偶数需要使用取余运算符实现该功能 number % 2 == 0
④根据判定情况,在控制台输出对应的内容
import java.util.Scanner; public class ifdemo3 { public static void Main(String[] args) { // 键盘录入方式输入数值 Scanner sc = new Scanner(System.in); System.out.println("请输入一个数: "); int num1 = sc.nextInt(); /* 判断证书是偶数还是奇数,采用数字处以2是否有余数 */ if(num1%2 ==0) { System.out.println(num1 + "是偶数"); } else { System.out.println(num1 + "是奇数"); } } }
3.3.4 if语句格式3
if(关系表达式1) { 语句体1; } else if(关系表达式2) { 语句体2; } .... else { 语句体n+1; }
执行流程:
①首先计算关系表达式1的值
②如果值为true就执行语句体1;如果值为false就计算关系表达式2的值
③如果值为true就执行语句体2;如果值为false就计算关系表达式3的值
④…
⑤如果没有任何关系表达式为true,就执行语句体n+1。
示例:键盘录入一个星期数(1,2,...7),输出对应的星期一,星期二,...星期日
import java.util.Scanner; public class ifdemo4 { public static void main(String[] args) { System.out.println("开始"); Scanner sc = new Scanner(System.in); System.out.println("请输入一个星期数(1-7): "); int weekdays = sc.nextInt(); if(weekdays == 1) { System.out.println("Monday"); } else if(weekdays == 2) { System.out.println("Tuesday"); } else if(weekdays == 3) { System.out.println("Wednesday"); } else if(weekdays == 4) { System.out.println("Thursday"); } else if(weekdays == 5) { System.out.println("Friday"); } else if(weekdays == 6) { System.out.println("Saturday"); } else { System.out.println("Sunday"); } System.out.println("结束") } }
3.3.5 if语句格式3: 案例
需求:小明快要期末考试了,小明爸爸对他说,会根据他不同的考试成绩,送他不同的礼物,
假如你可以控制小明的得分,请用程序实现小明到底该获得什么样的礼物,并在控制台输出。
分析:
①小明的考试成绩未知,可以使用键盘录入的方式获取值
②由于奖励种类较多,属于多种判断,采用if...else...if格式实现
③为每种判断设置对应的条件
④为每种判断设置对应的奖励
import java.util.Scanner; public class ifdemo5 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个分数"); int score = sc.nextInt(); if(score > 100 || score < 0) { System.out.println("你输入的分数不对"); } else if(score >= 95 && score <= 100) { System.out.println("山地车一辆"); } else if(score >= 90 && score <= 94) { System.out.println("游乐场游玩一次"); } else if(score >= 80 && score <= 89) { System.out.println("变形金刚玩具一个"); } else { System.out.println("胖揍一顿"); } } }