运算符介绍
运算符是一种特殊的符号,用以表示数据间的运算、赋值和比较等。
算数运算符
算数运算符用于对数值型变量间的计算。
注意:图片中最后一行,字符串相加的结果中间没有空格,这个课件错误❌。
除法[ / ]
System.out.println(10 / 4); // 从数学上看是2.5,在java中是2。 int -> int
System.out.println(10.0 / 4); // 数据类型为double 小数,输出是2.5 double -> double
double d = 10 / 4; // 运算为:2 -- > 2.0 int -> double精度提升
System.out.println(d);
取模(取余)
//取余
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
++ 的使用
当作为独立的语句使用时,前++ 和 后++ 都完全等价于 i= i+ 1;
// ++的使用
int i = 10;
i++; // i = i + 1;
++i; // i = i + 1;
System.out.println(i); // 输出为12
当作为表达式使用时:
-
前++ : ++i 表示先自增后赋值
-
后 ++: i++ 表示先赋值后自增
int j = 8;
// int k = ++j; // 等价 j = j + 1; k = j;
// System.out.println("k=" + k + " j=" + j); // k=9 j=9
int k = j++; // 等价 j = k; j = j + 1;
System.out.println("k=" + k + " j=" + j); // k=8 j=9
练习题:
int i = 1;
i = ++i; // i = i + 1; temp = i; i = temp;
System.out.println(i); // 2
int j = 1;
j = j++; // temp = j; j = j + 1; j = temp;
System.out.println(j); // 1
总结一句话:
执行++运算符时,会创建一个临时变量,逻辑看上方代码注释。
++ 在前,先++,再将值赋给temp, 然后将temp赋值给接收变量。
++ 在后,先将值赋给temp,再执行++, 然后将temp赋值给接收变量。
题目: 定义一个变量保存华氏温度,华氏温度转换为摄氏温度的公式为:5 / 9*(华氏温度 - 100),请求出华氏温度对应的摄氏温度。
注意: 不能直接拿过公式就使用,在实际运算中, 5 / 9 这一步,两个int 相除,得到的也是整数类型,所以结果为 0
由 0 *(华氏温度 - 100),得到的结果始终为 0.0。
关系[比较]运算符
-
关系运算符的结果都是 boolean 型,也就是要么为true,要么为 false;
-
关系运算符,经常用于 if 结构的条件中或者循环结构的条件中。
关系运算符一览
int a = 8;
int b = 9;
boolean d = a > b; // false
boolean s = "zhang" instanceof String;
逻辑运算符
用于连接多个条件,最终的结果也是一个boolean值
总结:
-
逻辑与& 和 短路与 && 效果是一样的: 有假则假
-
逻辑或|和 短路或 || 效果是一样的: 有真则真
-
! :取反
-
逻辑异或 ^: 不同则为true, 同真同假返回false。
区别:
- 逻辑与& 和 短路与 &&
短路与 && 在第一个为false时,则第二个条件不会进行判断,最终结果为false,效率高。【推荐】
int a = 4;
int b = 9;
if (a < 1 && ++b < 50){
System.out.println("OK");
}
System.out.println("b的值为:" + b); // 9
练习题
赋值运算符
介绍
将某个运算后的值,赋给指定的变量。
赋值运算符的分类
- 基本负值运算符 =
int a = 10;
-
复合赋值运算符
+=、 -= 、*= 、/= 、%=: 加、减、乘、除、余
a += b → a = a + b;
a %= b → a = a % b
细节
复合运算符会进行类型的强制转换
byte b = 3;
b += 2;
//我们理解的内部逻辑为: b = b + 2
//但注意 2是int,所以运算后,后面的表达式会进行自动类型转换,输出的结果为int类型,而b为byte类型,所以会报错。
//为了避免这种情况,赋值运算符会进行强制类型转换。 b = (byte)(b + 2);
//b ++; 也会对类型进行强转,输出为byte类型。
//在三元运算符中的 b++ 不会进行强转。
三元运算符
基本语法
条件表达式 ? 表达式1: 表达式2;
运算规则:
1、如果条件表达式为true,运算后的结果为表达式1;
2、如果条件表达式为false,运算后的结果为表达式2;
int a = 10;
int b = 99;
int result = a > b ? a++ : b --; // a>b为false, 执行b--,所以结果为:99
细节
1、表达式1 和 表达式2 要是可以赋给接收变量的类型(满足自动转换或者手动强制转换)
2、三元运算符底层为 if–else 语句。
运算符优先级
运算符优先级梳理:
1、()、{} 等 【第一行】
2、单目运算 ++ 、-- 【 第二行】
3、算术运算符 【第三行 - 第四行】
4、位移运算符 (<<、>> 、 >>> 位移 ) 【第五行】
5、比较运算符 【第六行 - 第七行】
6、逻辑运算符 【第八行 - 第十二行】
7、三元运算符 【第十三行】
8、赋值运算符 【第十四行到最后】
标识符命名规则【规则:必须遵守,否则报错。】
1、由26个英文字母大小写、0-9数字,或$组成
2、数字不可以开头。int 3ab= 1: // 错误❌
3、不可以使用关键字和保留字,但能包含关键字和保留字。
4、Java中严格区分大小写,长度无限制。int tptalNum = 10; int n = 9;
int n = 40;
int N = 50;
System.out.println(n); // 40
System.out.println(N); // N. 50
5、标识符间不能包含空格。 int a b = 90; ❌
标识符命名规范【规范:更加专业】
1、包名:多单词组成时,所有字母都小写。比如:com.zhangch.crm
2、类名、接口名【大驼峰】: 多单词组成时,所有单词的首字名大写。
比如:XxxYyyZzz 。 publi class MonsterEnergy
3、变量名、方法名【小驼峰】:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写。 比如:xxxYyyZzz 。 int monsterEnergy
4、常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ,比如:定义一个所得税率:TAX_RATE. MONSTER_ENERGY
Java代码规范
键盘输入语句
在编程中,需要接受用户输入的数据,用户就可以使用键盘输入语句。使用到的方法为 扫描器(对象),就是Scanner
步骤
1、导入该类的所在包, java.util.*
2、创建该类对象(声明变量)
3、调用对象的功能
演示
import java.util.Scanner; // 将Scanner类导入
public class Input{
public static void main(String[] args){
//1、引入Scanner这个包
//2、创建Scanner对象实例, new 创建一个对象
Scanner myScanner = new Scanner(System.in);
//3、调用对应的输入方法,接收用户的输入
System.out.println("请输入名字");
String name = myScanner.next();
System.out.println("请输入年龄");
int age = myScanner.nextInt();
System.out.println("请输入薪水");
double salary = myScanner.nextDouble();
System.out.println("信息如下:\n" + "name" + name + "年龄" + age + "薪水" + salary);
}
}
进制
对于整数:
有四种表示方式:
1、二进制: 0,1 满2进1, 以0b或0B开头。
2、八进制: 0 - 7 满8进1,以数字0开头表示。
3、十进制:0 - 9 满10进1。
4、十六进制: 0-9及 a(10) - f(15),满16进1,以0x或0X开头表示。此处的A-F不区分大小写。
举例说明
int n1 = 0b1010; // 1 * 2 ^ 3 + 1 * 2 ^ 1 = 10
int n2 = 01010; // 1 * 8 ^ 3 + 1 * 8 ^ 1 = 520
int n3 = 1010; // 1 * 10 ^ 3 + 1 * 10 ^ 1 = 1010
int n4 = 0x1010; // 1 * 16 ^ 3 + 1 * 16 ^ 1 = 4112
二进制、八进制、16进制 转换成十进制
规则:从最低位开始,将每个位上的数提取出来,乘以 2 (8、16)的(位数 - 1)次方,然后求和。
0b1010; → 1 * 2 ^ (4-1) + 1 * 2 ^ (2-1) = 10
01010; → 1 * 8 ^ 3 + 1 * 8 ^ 1 = 520
0x1010; → 1 * 16 ^ 3 + 1 * 16 ^ 1 = 4112
十进制 转换成 二进制、八进制、16进制
规则:将该数不断除以2(二进制)8(八进制)16(十六进制),直到商为0为止,然后将每步得到的余数倒过来,就是对应的 进制。
二进制转八进制、16进制
规则:从低位开始,将二进制数字每三位一组,转成对应的八进制数即可。
案例:0b 11010101 转成八进制: 11(3)010(2)101(5) → 0325
规则:从低位开始,将二进制数字每四位一组,转成对应的16进制数即可。
案例:0b 11010101 转成16进制: 1101(D)0101(5) → 0XD5
八进制转换成二进制
规则:将八进制数每1位,转成对应的一个3位的二进制数即可。
案例:将 0237 转成二进制。
0237 → 2(010)3(011)7(111) → 0B10011111
16进制转换成二进制
规则:将16进制数每1位,转成对应的一个4位的二进制数即可。
案例:将 0x23B 转成二进制。
0x23B → 2(0010)3(0011)B(1011) → 0B001000111011
位运算
原码、反码、补码【背下来】
1、二进制的最高位是符号位:0表示正数,1表示负数
2、正数的原码、反码、补码都一样。
3、负数的反码 = 负数的原码符号位不变,其他位取反(0变1,1变0)。
4、负数的补码 = 负数的反码 + 1, 负数的反码 = 负数的补码 - 1
5、0的反码、补码都是0
6、java没有无符号数,换言之,java中的数都是有符号的
7、在计算机进行运算的时候,都是以补码的方式来进行运算的。
8、当我们看运算结果的时候,要看他的原码。
java中的7个位运算
分别为 按位与&、按位或|、按位异或^、按位取反~
按位与 &: 有假则假,即有0则0
按位或 | : 有真则真,即有1则1
按位异或 ^:相同为0, 不相同为1
按位取反 ~: 0 → 1 ; 1→0
建议看下:P98 - P103