1. 运算符
1.1 算数运算符
-
加减乘除就不说了,主要说明取模运算:%,它的实际公式如下:
a%b = a - a/b*b
10 % 3 结果为 1;-10 % 3 结果为 -1;10 % -3 结果为 1 ;-10 % -3 结果为 1
例子:-10.5%3
// a%b,当 a 为小数时,有一个对 a 的强制类型转换,公式为:a - (int)a/b*b,即 -10.5 - (-10)/3*3
-
着重说明一个面试题:
int i = 1; i = i++; //规则使用临时变量:(1)临时变量 temp = i(等号右边,因为++优先级比=高);(2)i = i + 1(等号右边);(3)再 i = temp(等号左边) System.out.println(i); //输出结果为 1
int i = 1; i = ++i; //规则使用**临时变量**:(1)i = i + 1;(2)临时变量 temp = i;(3)再 i = temp System.out.println(i); //输出结果为 2
-
int c = 1; System.out.println(c++); //输出结果为1
1.2 关系运算符
==,!=, >, <, >=, <= 他们都返回类型都是布尔类型(boolean)的。
1.3 逻辑运算符
-
短路与:&&,短路或:||,取反:!。
-
逻辑与:&,逻辑或:|,逻辑异或:^。
-
短路与 && 和逻辑与 & 的区别,短路与 && 若第一个条件为 false,则后面的条件不会执行;逻辑与 & 第一个条件为 false,则后面的条件也会执行;短路或 || 第一个条件成立则后面的条件不会执行,而逻辑或 | 两个条件都会执行。如下:
int a = 4; int b = 9; if(a < 1 && ++b < 50){ System.out.println("OK"); } //OK 不会输出,由于 a < 1不成立,则 && 后面的条件 ++b < 50 不会被执行,即 b 还是为 9;
```java int a = 4; int b = 9; if(a < 1 & ++b < 50){ System.out.println("OK"); } //OK 不会输出,虽然 a < 1不成立,但是 & 后面的 ++b < 50 还是会被执行,即 b 为 10;
-
综合练习:
boolean x = true; boolean y = false; short z = 46; //1. 判断z == 46 true;2. z 自加;3. 判断 y = true 的逻辑值,此处为给 y 赋值 “ = ”,y 变为true,整个 && 表达式为真,执行 z++; if((z++ == 46) && (y = true)) z++; if((x = false) || (++z == 49)) z++; //同上,注意 x = false 是赋值语句,|| 前面的条件不成立,要执行后面的 ++z == 49 System.out.println(z); //输出结果为 50
1.4 赋值运算符
-
基本赋值运算符:=
-
复合赋值运算符:+=,-=,*=,/=,%= 。以 a += b 为例,意义为:a = a + b;
-
赋值运算符左边只能是变量,右边可以是变量、表达式、常量值。
-
复合赋值运算符会进行类型的转换,如:
byte b = 3; b += 2; // 等价于 b = (byte)(b + 2);若写成 b = b + 2 则会报错 b + 2 为 2 一样的 int 类型,无法赋值给 byte 类型的 b b++; //等价于 b = (byte)(b + 1)
1.5 三元运算符
-
形式为:条件表达式 ? 表达式1 : 表达式2;
-
表达式1 和 表达式2 要为可以赋给接收变量的类型(或可以自动转换),如:
int c = 10 > 2 ? 1.1 : 3.2; //报错,1.1 double 类型不能赋值给 int 类型的 c,若把 int c 改为 double c 就可以运行
-
三元运算符返回值以整体精度最高作为返回,如:
System.out.println(3>2?1:2.0);//因为1为int,2.0为double,提升了三元运算符整体的精度,因此整体返回为1.0的double //注意:任意输一个System.out.println(2.0);,这个2.0是double不是float
1.6 位运算符
1.6.1 原码、反码、补码
-
二进制的最高位是符号位:0 表示正数,1 表示负数
-
正数和 0 的原码,反码,补码都一样(三码合一)
-
负数的反码 = 它的原码符号位不变,其他位取反
-
负数的补码 = 它的反码 + 1,负数的反码 = 负数的补码 - 1
-
JAVA 中的数都是有符号的
-
计算机运行的时候,都是以补码的方式来运算的
-
当我们看运算结果的时候,要看它的原码
案例一:针对第 6 和第 7 条,因为 println 中的语句 2&3 中的数字是 int 类型的,所以 4 个字节 32 位:
案例二:
下图1-2:负数的反码 = 符号位不变,其他位取反
下图2-3:负数的补码 = 负数的反码 + 1
下图3-4:取反 ~ 操作对补码的所有位进行取反
下图4-5:取反后看到符号位是 0 ,表示结果那个数的补码是个正数,故由于正数三码合一,原码也等于补码
案例三:
1:正数的补码 = 原码 = 反码
2:取反 ~ 操作对补码的所有位进行取反,取反后看到符号位是 1 ,表示结果那个数的补码是个负数
3:负数的反码 = 负数的补码 - 1
4:负数的原码 = 负数的反码符号位不变,其他位取反
1.6.2 位运算符
-
java 中有 7 个位运算符:
&(按位与),|(按位或),^(按位异或),~(按位取反)
>>(算术右移),<<(算数左移),>>>(无符号右移)
-
算术右移 >> :低位溢出,符号位不变,并用符号位补溢出的高位。4 >> 2 等价于 4 / 2 / 2
-
算数左移 << :符号位不变,低位补 0。4 << 2,等价于 4 * 2 * 2
-
无符号右移 >>> 又叫逻辑右移:低位溢出,高位补 0
2. 运算符优先级
-
第一类:(), {} 等
-
单目运算符:++,--,~,!
-
算术运算符:*,/,%,+,-
-
位移运算符:<<, >>
-
比较运算符:==,!=
-
逻辑运算符:&,^,|,&&,||,
-
三元运算符:? :
-
赋值运算符:=, += 等
3. 标识符
-
java 的标识符由 26 个英文字母的大小写(区分)、数字、下划线 “_” 和 “$” 组成。
-
数字不能开头,不可以使用关键字和保留字。
-
命名规范:
包名:多单词组成时所有字母都小写,如:aaa.bbb.ccc
类名,接口名:多单词组成时,所有单词首字母大写:XxxYyyZzz(大驼峰形式),比如:TankShotGame
变量名,方法名:多单次组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz(小驼峰形式),比如:tankShotGame
常量名:所有字母都大写。多单词时每个单词用下划线链接:XXX_YYY_ZZZ,比如定义一个税率:TAX_RATE
4. 键盘输入语句
在编程中需要用户输入数据,如 C++ 的 cin,JAVA中需要一个扫描器(对象),就是 Scanner。步骤如下:
-
导入该类的所在包:import java.util.Scanner;
-
创建该类的对象:Scanner myScanner = new Scanner(System.in);
-
调用类的方法:int age = myScanner.next(); //此处的 next() 为类 Scanner 的方法,
接收整型的方法:.nextInt(),接收字符串的方法:.nextString(),接收字符的方法:.next().charAt(0) ——实质上是接收了字符串的第一个字符
程序如下:
5. 进制
-
二进制以 0b 或者 0B开头,如:0b1010
八进制以 0 开头,如:057
十六进制以 0x 或 0X 开头,如:0x5AB9
5.1 进制转换
-
十进制转八进制、十六进制的方法与二进制一样。
-
二进制转八进制、十六进制,从低位到高位,三个(八进制)或四个(十六进制)为一组,转化为相应的八 or 十六进制。八 or 十六转二,操作相反。