一、运算符介绍
- 1、 介绍:运算符是一种特殊的符号,用于表示数据的运算、赋值和比较等
- 2 、作用:主要是对数值类型的变量进行运算的
- 3 、种类:+ | - | * | / | % | ++ |- -
二、算数运算符
- 1、 除法的使用
System.out.println(10 / 4);//输出2,两边都是整数 int,最后结果也是整数 int ,是数学上的结果对下取整
System.out.println(10.0 / 4);//输出2.5,前面是double,后面 int ,运算时,自动把 int 转成 double 进行运算,这样,小数就可以保留下来了
double d = 10 / 4;
System.out.println( d );//输出2.0,运算的两个结果是 int 型数据 2,再把这个 2 赋值给 double 类型的数据 d ,就变成了 2.0
- 2、 % 的使用,% 的本质是 a % b = a- [a / b * b]
(a / b) 为 int 型
System.out.println(10 % 3); //输出 1 ; 10 除以 3 商为 3,余数为 1
System.out.println(-10 % 3); //输出 -1;-10 除以 3 商为 -3,余数为 -1
System.out.println(10 % -3); //输出 1 ; 10 除以 -3 商为 -3,余数为 1
System.out.println(-10 % -3); //输出 -1;-10 除以 3 商为 -3,余数为 -1
- 3、 ++ /-- 的使用
++ 自增加法(加 1 ), – 自减减法(减一),这里只讲述 ++ ,但是 – 的使用方法都是一致的;
(1)独立使用时,放在前面和后面都一样
int a = 1;
int b = 1;
a++;
++b;
System.out.println(a);//输出2
System.out.println(b);//输出2
(2)在前时,先加 1 ,在运算;在后时,先以原来的数值进行运算,运算完成后,再次加一
int a = 1;
int b = a++;
int c = ++a;
System.out.println(a);//输出3,a 自增两次 a + 1 + 1 = 3
System.out.println(b);//输出1,因为 b = 原始 a(为1),复制完成之后,a = a + 1 = 2;
System.out.println(c);//输出3,因为 c = a + 1 + 1,在前方,先完成自增, a = a + 1 = 3,再进行赋值
- 4、 面试题 ①
int i = 1;//1 --> i
i = i++; //(1)temp = i; (2)i = i + 1; (3) i = temp;也就是说,在完成这个语句操作时,用到了一个临时变量 temp ,这个 ++ 在后面,
//所以就是先赋值,再 +1,所以有了第一步,temp 的值为 1,执行(2),i 自增,执行(3),最后把 temp 赋值给 i ,所以最终结果为1
System.out.println(i);//输出 1
- 5、 面试题 ②
int i = 1;//1 --> i
i = ++i;//(1)i = i + 1; (2)temp = i; (3) i = temp;也就是说,在完成这个语句操作时,用到了一个临时变量 temp ,这个 ++ 在前面,
//底层执行时,是先 +1,再 赋值,所以有了第一步,i 自增,i 为 2,执行(2) temp 的值为 2,执行(3),最后把 temp 赋值给 i ,所以最终结果为2
System.out.println(i);//输出2
- 6 、课堂练习题 ① :写出输出结果
int n1 = 10;
int n2 = 20;
int i = n1++;
System.out.println(i); //输出10
System.out.println(n2);//输出20
i = --n2;
System.out.println(i); //输出19
System.out.println(n2);//输出19
- 7 、课堂练习题 ② :假如还有 59 天放寒假,问:还有 ?个星期零 ?天
//思路分析:定义一个 int型 变量保存总天数 59;然后星期就是总天数 / 7,零头天数就是 59 % 7;
int day_sum = 59;
int week_num = 59 / 7;
int day_num = 59 % 7;
System.out.println("还有" + week_num + "个星期"); //输出 还有8个星期
System.out.println("还有零" + day_num + "天"); //输出 还有零3天
- 8、 课堂练习题 ③:已知公式:摄氏温度 = (5/9) * (华氏温度- 100);定义一个变量保存华氏温度,求出对应的摄氏温度
(扩展:写出一个程序能完成输入 摄氏温度,输出 华氏温度)
//思路分析:因为涉及到了分数运算,所以应该用 double 类型的变量来存储数据,然后根据公式求出结果
double fahrenheit = 234.6;
//double celsius = (5 / 9) * fahrenheit - 100;//这个地方 5 / 9 一定要转换成 double型
double celsius = (5 / 9.0) * fahrenheit - 100;
System.out.println("华氏温度" + fahrenheit + " 对应的摄氏温度为 " + celsius );
//输出 华氏温度234.6 对应的摄氏温度为 74.77777777777777
三、关系运算符(比较运算符)
- 1、介绍
关系运算符的结果都是 boolean型,也就是说,结果要么是 true ,要么就是 false,关系表达式一般用于判断语句中 - 2、种类
==(等于) !=(不等于) < > <= >= instanceof(检查是否为类的对象 例如 “陈鑫” instanceof String ;//结果是 true )
int a = 9;
int b = 8;
System.out.println(a > b); //输出 true
System.out.println(a >= b); //输出 true
System.out.println(a < b); //输出 false
System.out.println(a <= b); //输出 false
System.out.println(a == b); //输出 false
System.out.println(a != b); //输出 true
boolean flag = a >b; //flag 的值为 true
-
3、细节和使用注意
相等 == 不能写成 =;关系运算符组成的表达式,称之为关系表达式
四、逻辑运算符
-
1、 介绍:用于连接多个条件(多个关系表达式),最终结果也是一个 boolean型 的值
-
2、种类:
&与(全真为真,否则为假)|或(只要有一个为真,就为真,全假时,才为假)
&&短路与(与&一样)
||短路或(与|一样)
!取反 ^异或(相异为真,相同为假)
-
3、&& 和 & 的区别:
&&当第一个条件为 false 时,不会去判断第二个条件(即为不去执行第二个条件的语句),直接得出 false 的结果;&当第一个条件为 false 时,仍然会判断第二个条件(即为 去执行第二个条件的语句),效率低;
所以再程序开发过程中,一般都使用 && ,效率高
int a = 4; int b = 9; if(a < 1 && ++b < 20){ System.out.println("ok&&"); //条件不满足,不输出 } System.out.println("a =" + a + " b = " + b); //输出 a = 4 b = 9 ******************************************************************************* int a = 4; int b = 9; if(a < 1 & ++b < 20){ System.out.println("ok&"); //条件不满足,不输出 } System.out.println("a =" + a + " b = " + b); //输出 a = 4 b = 10 //从上述两部分代码就可以看出区别
-
4、|| 和 | 的区别:
||当第一个条件为 true 时,不会去判断第二个条件(即为不去执行第二个条件的语句),直接得出 true 的结果;|当第一个条件为 true 时,仍然会判断第二个条件(即为 去执行第二个条件的语句),效率低;
所以再程序开发过程中,一般都使用 || ,效率高
int a = 4; int b = 9; if(a < 10 || ++b < 20){ System.out.println("ok||"); //输出 ok|| } System.out.println("a =" + a + " b = " + b); //输出 a = 4 b = 9 ******************************************************************************* int a = 4; int b = 9; if(a < 10 | ++b < 20){ System.out.println("ok|"); //输出 ok| } System.out.println("a =" + a + " b = " + b); //输出 a = 4 b = 10 //从上述两部分代码就可以看出区别
-
5、取反操作 !
如果原来为 true ,则运行后为 false
如果原来为 false ,则运行后为 trueSystem.out.println(a > b); //输出 true System.out.println(!(a > b)); //输出 false
-
6、逻辑异或 ^ 相异为真,相同为假
boolean b = (1 < 10) ^ (3 > 5); //这行本质为 true ^ false ,所以根据 异或运算 法则,所得到的结果为真,赋值给b System.out.println("b = " + b); //输出 b = true
-
7、课堂练习题:写出程序输出
(1) 第 1 题
int x = 5;
int y = 5;
if(x++ == 6 & ++y == 6){
x = 11;
}
System.out.println("x = " + x + " y = " + y); //输出 x = 6 y = 6, & 前后都判断,y 加1
(2) 第 2 题
int x = 5;
int y = 5;
if(x++ == 6 && (++y == 6)){
x = 11;
}
System.out.println("x = " + x + " y = " + y); //输出 x = 6 y = 5, && 判断了前面为 false ,后面不去判断执行,y 不加1
(3) 第 3 题
int x = 5;
int y = 5;
if(x++ == 5 | ++y == 5){
x = 11;
}
System.out.println("x = " + x + " y = " + y); //输出 x = 11 y = 6,| 前后都判断,前面为真,后面继续执行,y 加1
(4) 第 4 题
int x = 5;
int y = 5;
if(x++ == 5 || ++y == 5){
x = 11;
}
System.out.println("x = " + x + " y = " + y); //输出 x = 11 y = 5, || 判断了前面为真,后面不去执行,y 不加1
(5) 第5题
boolean x = true;
boolean y = false;
short z =46;
if((z++ == 46) && (y == true)) //第一个为true ,第二个为false,所以 z 只在判断时加1 z = 47
z++;
if((x == false) || (++z == 46)) //第一个为false,第二个为false,所以 z 又在判断时加1 z = 48
z++;
System.out.println("z = " + z); //输出 z = 48
(6) 第6题
boolean x = true;
boolean y = false;
short z =46;
if((z++ == 46) && (y = true)) //第一个为true ,第二个为赋值语句,把 true 赋 给了 y ,最终逻辑还是 true,所以进入{},
z++; //z 在判断时加1 (z = 47),进入{}又加1 (z = 48)
if((x = false) || (++z == 49)) //第一个为false,第二个为 true ,所以进入{}, z 在判断时加1 (z = 49),进入{}又加1, (z = 50)
z++;
System.out.println("z = " + z); //输出 z = 50
五、赋值运算符
-
1、介绍
赋值运算符就是将某个运算后的值,赋给指定变量 -
2、种类
基本赋值运算符 =;符合赋值运算符 += -= *= /=
以 += 作为例子,其他都是相同道理:
a += b <==> a = a + b;int n1 = 4; n1 += 10; System.out.println(n1); //输出 14 n1 /= 3; System.out.println(n1); //输出 3
-
3、特点
(1) 运算顺序从左往右(2) 赋值运算符的左边 只能是常量,右边 可以是变量、常量、表达式
int num1 = 20; int num2 = 78 * 32 - 19; int num3 = a;
(3) 复合运算符会进行类型转换
byte b = 2; b += 3; // <==> b = (byte)(b + 2);这个是自动的,不能写成 b = b + 2; b ++; // <==> b = (byte)(b + 1);这个是自动的,没有任何问题
六、位运算符 和 位运算
-
1、便捷 补码 运算方式 :
从 原码 看,符号位保持1不变,数值位从右边数第一个1及其右边的0保持不变,左边按位取反。 -
2、位运算符 一共有7个 & | ^ ~ >> << >>>
(1) 下面这四个运算都要装换成 二进制 的数 按位进行操作,得到最终结果
& 按位与 :全 1 为 1 ,否则为 0
| 按位或 :有 1 为 1 ,全 0 则 0
^ 按位异或:相异为 1,相同为 0
~ 按位取反:1 -> 0 ; 0 -> 1(2) >> 算术右移 / << 算术左移 / >>> 无符号右移
①/>>/算术右移 (移动 1 位除以 2) :低位溢出直接丢掉,用符号位来补全高位:
int a = 1 >> 2; System.out.println(a); //输出 0 1的 原码 00000000 00000000 00000000 00000001 1的 补码 00000000 00000000 00000000 00000001 向右移动两位00000000 00000000 00000000 00000000 01;01 溢出,直接不要了所以最后结果就是 0
②/<</ 算术左移 (移动 1 位乘以2) :符号位不变,低位补 0
int a = 1 >> 2; System.out.println(a); //输出 1的 原码 00000000 00000000 00000000 00000001 1的 补码 00000000 00000000 00000000 00000001 向左移动两位00 00000000 00000000 00000000 00000100;00 溢出,直接不要了所以最后结果就是 4
③/>>>/无符号右移:低位溢出直接丢掉,高位直接补 0
-
3、移位运算
int a = 1 >> 2; //1 向右算术位移 2 位 int b = -1 >> 2; //-1 向右算术位移 2 位 int c = 1 << 2; //1 向左算术位移 2 位 int d = -1 << 2; //1 向左算术位移 2 位 int e = 3 >>> 2; //3 向右无符号位移 2 位 System.out.println("a=" + a); //输出 System.out.println("b=" + a); //输出 System.out.println("c=" + a); //输出 System.out.println("d=" + a); //输出 System.out.println("e=" + a); //输出
-
4、按位运算 ~ & | ^
-
5、原码、补码、反码
二进制的最高位是符号位, 0–>正 ; 1–>负正数 的 原码、补码、反码 三者一致,即 三码合一
负数 的 反码 为:符号位不变,其他位 按位取反
负数 的 补码 为:它的 反码 +1 ,即 负数补码 = 负数反码 + 1
0 的 反码 补码 都是 0
Java中的数全都是 有符号数,计算机运行的时候,使用 补码 进行计算,我们人看计算结果的时候,是看最终的 原码
int n1 = 2&3; System.out.println(n1);//输出 2 2 & 3 2 的 原码 00000000 00000000 00000000 00000010 2 的 补码 00000000 00000000 00000000 00000010 3 的 原码 00000000 00000000 00000000 00000011 3 的 补码 00000000 00000000 00000000 00000011 2 的 补码:00000000 00000000 00000000 00000010 3 的 补码:00000000 00000000 00000000 00000011 运算得到的补码 & 00000000 00000000 00000000 00000010 转换过后得到的原码 00000000 00000000 00000000 00000010,所以最终结果是 2 ******************************************************************************** int n2 = ~ -2; System.out.println(n3);//输出 1 ~ -2 -2 的 原码 10000000 00000000 00000000 00000010 -2 的 反码 11111111 11111111 11111111 11111101 -2 的 补码 11111111 11111111 11111111 11111110 运算得到的补码 ~ 00000000 00000000 00000000 00000001 转换过后得到的原码 00000000 00000000 00000000 00000001,所以最终结果是 1 ******************************************************************************* int n3 = 2|3; System.out.println(n3);//输出 3 2 | 3 2 的 原码 00000000 00000000 00000000 00000010 2 的 补码 00000000 00000000 00000000 00000010 3 的 原码 00000000 00000000 00000000 00000011 3 的 补码 00000000 00000000 00000000 00000011 2 的 补码:00000000 00000000 00000000 00000010 3 的 补码:00000000 00000000 00000000 00000011 运算得到的补码 | 00000000 00000000 00000000 00000011 转换过后得到的原码 00000000 00000000 00000000 00000011,所以最终结果是 3 ******************************************************************************* int n1 = 2 ^ 3; System.out.println(n1);//输出 1 2 ^ 3 2 的 原码 00000000 00000000 00000000 00000010 2 的 补码 00000000 00000000 00000000 00000010 3 的 原码 00000000 00000000 00000000 00000011 3 的 补码 00000000 00000000 00000000 00000011 2 的 补码:00000000 00000000 00000000 00000010 3 的 补码:00000000 00000000 00000000 00000011 运算得到的补码 ^ 00000000 00000000 00000000 00000001 转换过后得到的原码 00000000 00000000 00000000 00000001,所以最终结果是 1
七、三元运算符
-
1、基本介绍
基本语法: 条件表达式 ? 表达式1 : 表达式2
如果 条件表达式成立 ,即为 true ,运算后的结果是 表达式1
如果 条件表达式不成立,即为 false ,运算后的结果是 表达式2口语:一真大师,真的就运行第一个
一定要记住,三元运算符是一个整体,会自动转换成精度最高的那个数据类型进行运算,比如
true ? int 2 : double 3.0; //最后的输出是 2.0,就是因为int类型自动转换成了double类型
-
2、使用细节
(1)表达式1 和 表达式2 要为可以赋给接收变量的类型(或自动转换/强制转换)//也就是说 这两个表达式必须要符合左边的赋值语句的数据类型int a = 3; int b = 4; int c = a > b ? a : b; //int类型 赋值给 int类型 完全可以 //int c = a > b ? 1.1 : 2.2; //dounle类型 赋值给 int类型 不可以,编译报错:不兼容的数据类型 int c = a > b ? (int)1.1 : (int)2.2;//dounle类型经过强制转换之后,变成 int类型, 赋值给 int类型 完全可以 double d = a > b ? a + 2 : b; //int类型 赋值给 double类型 ,有自动转换存在,完全可以
(2)三元运算符可以转换成 if–else 语句
int res = a > b ? a++ : b--; if(a > b) res = a++; else res = b--;
-
3、课堂练习,实现求出三个数的最大值
//思路:先得到 n1 和 n2 中的最大值,保存到 max 中
// 再与第三个数作比较,如果 n3 > max ,则 max 就是 n3,否则就是 max
int n1 = 11;
int n2 = 22;
int n3 = 33;
int max1 = n1 > n2 ? n1 : n2;
int max2 = max1>n3 ? max1 : n3;
System.out.println(max2); //输出 33
八、运算符优先级(从上到下)
(1)、() {}
(2)、单目运行 ++ / - -
(3)、算数运算符
(4)、移位运算符
(5)、比较运算符
(6)、逻辑运算符
(7)、三元运算符
九、标识符的命名规则与规范
-
1、标识符
Java对各种变量、方法和类等命名时使用的字符序列凡是自己可以其名字的地方都叫标识符
-
2、标识符的规则
(1)、由26个英文字母大小写,0-9,_ 或 & 组成(2)、数字不可以开头
(3)、不可以使用关键字和保留字,但是能包含关键字和保留字
(4)、Java中严格区分大小写,长度无限制
(5)、标识符中不能包含空格
-
3、标识符的规范(这样写更加的更加的专业,代码更具有可读性)
(1)、包名:多单词组成时所有字母小写: aaa.bbb.ccc(2)、类名、接口名:多单词组成时,所有单词的首字母大写 XxxYyyZzz
(3)、变量名、方法名(函数名):多单词组成时,第一个单词首字母小写,从第二个单词开始每个单词首字母大写 xxxYyyZzz
(4)、常量名:所有字母都大写。多单词时使用下划线进行连接 XXX_YYY_ZZZ
(5)、后面我们学习到 类、包、接口等时,我们的命名规范要这样遵守,更加详细的看文档
十、键盘输入语句
-
1、介绍
在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取,需要一个扫描器(对象),就是 Scanner -
2、步骤
导入该类所在的包,(import) java.util.*;创建该类对象(声明变量);调用里面的功能例如:编写一个可以 从控制台接受用户信息[姓名,年龄,薪水] 的程序
//设计思路: //1、导入 Scanner 所在的包 //2、创建一个 Scanner 对象 //3、接收用户的输入,使用相关的方法 Scanner scanner =new Scanner(System.in); System.out.println("请输入你的名字"); String name = scanner.next(); //next() 是接收 字符串型 数据 System.out.println("请输入你的年龄"); int age = scanner.nextInt(); //nextInt() 是接收 int型 数据 System.out.println("请输入你的薪水"); double money = scanner.nextDouble(); //nextDouble() 是接收 double型 数据 System.out.println("你的信息如下:\n" + "姓名\t" + "年龄\t" + "薪水\t\n" + name + '\t' + age + '\t' + money + '\t' ); //运行结果 //你的信息如下: //姓名 年龄 薪水 //陈鑫 21 8000.0
十一、进制 8421解君愁
-
1、介绍:Java会用到4种进制
二进制 :0b 或者 0B 开头;满 2 进 1八进制 :0 开头 ;满 8 进 1
十进制 : ;满 10 进 1
十六进制:0x 或者 0X 开头;满 16 进 1,A = 10, B = 11, C = 12, D =13, E = 14, F = 15
int n1 = 0b1011 ; // 二进制 int n2 = 01010 ; // 八进制 int n3 = 1111 ; // 十进制 int n4 = 0X10101; // 十六进制 System.out.println(n1); //输出 11 System.out.println(n2); //输出 520 System.out.println(n3); //输出 1111 System.out.println(n4); //输出 65793
-
2、进制转换 X进制 --> 十进制
与 十进制 相关的转换 从最低为(最右边)开始,将每位上的数字提出来,乘以 X 的(位数 - 1)次方,然后求和 // X 是哪一种进制,可取二、八、十六以二进制 转 十进制 为例,展示一遍
0B1011 = 1 * 2的(1-1)次方 + 1 * 2的(2-1)次方 + 0 * 2的(3-1)次方 + 1 * 2的(4-1)次方
= 1 + 2 + 0 + 8 = 11 -
3、进制转换 十进制 --> X进制
该 十进制 的数,不断除以 X ,直到商为 0 为止,然后将每步的余数倒过来,就是它所对应的 X 进制十进制 转 二进制、 十进制 转 八进制、 十进制 转 十六进制 都是上述讲的这个方法
-
4、二、八、十六进制之间互相转换 8421法
十二、本章作业
1、写结果
10 / 3 = 3;
10 / 5 = 2;
10 % 2 = 0;
-10.5 % 3 = -1.5;//(机器运算可能是接近 -1.5 的一个小数)
2、写结果
int i = 66;
System.out.println(++i + i);//输出 134 实质就是 67 + 67 =134
3、下面赋值语句正确的是
int n1 = (int)"18"; //错误,应该是 int n1 = Inteager.parseInt("18");
int n2 = 18.0; //错误,double型 赋值给 int型
double n3 = 3.3d; //正确,后面加上 d/D 就明确是 double型 的数据
double n4 = 3; //正确,int型 赋值给 double型,自动转换
int i = 48; char c = i + 1; //错误,i + 1 之后数据是 int型,无法再赋值给 char型
byte b = 19;short s = b + 2;//错误,byte、short数据运算时,数据类型为 int型 ,无法再赋值给 short
4、试写出将 String类型 转换成 double类型 的语句,以及将 char类型 转换成 String类型 的语句,说明即可
String str = "3.14";
double d = Double.parseDouble(str);
char c = 'a';
String sc = c +"";