JAVA基础语法02
目录
- 运算符
运算符
运算符种类
- 算术运算符
- 赋值运算符
- 关系运算符 instanceof
对象实例 instanceof 类名
,返回布尔值。判断实例是否属于这个类。
- 逻辑运算符
- 位运算符 ^ ~ << >> >>>
- 异或、取反、左移、右移、无符号右移
- 条件运算符
- 扩展赋值运算符 +=、%=
- Java没有幂运算运算符。可以用
Math.pow(2,3)
表示2^3。此方法参数与返回值都是double。
instanceof子类父类
- 子类 instanceof 父类 –> true
- 父类 instanceof 子类 –> false
逻辑运算-短路运算
- 逻辑运算如果前一个已经计算出结果,后面的一个还没有运算,则不运算后面的逻辑式,如果后面的逻辑式有改变变量值的操作,此操作不会被实现。
int a = 3;
boolean re = false && ++a > 4;
System.out.println(a); //a=3,++a不会被运算
re = true || (a++)>4;
System.out.println(a);//a=3,a++不会被运算,甚至括号都不能让其优先级提高。
- 与只要一假,或只要一真。就进行短路运算。
位运算
- 左移 <<
- 没有无符号左移,凡是左移都是在末尾补0。
- 约等于乘以二操作。
- 右移 >>
- 约等于除以二操作。
- 补位与符号位一致
- 无符号右移 >>>
- 补位补0
- 无符号右移是针对无符号数的,或者说其返回值是unsigned int的无符号数,若对有符号数的负数进行右移操作,并不能得到除以二的目的,事实上,对于较小的有符号负数右移结果是一个特别大的正数,而对于接近32位极限的特别大的负数,得到的结果是一个特别小的正数,极端情况,对于-2^31进行移位操作得到的结果是0。
- 以下是对byte类型的-16进行移位操作的范例
byte a=-0b1_0000;//二进制的负数符号在最前面。在0b前面。
System.out.println("a:/t/t"+Integer.toBinaryString(a));
system.out.println("a>>1:/t"+Integer.toBinaryString(a>>1));
System.out.println("a<<1:/t"+Integer.toBinaryString(a<<1));
System.out.println("a>>>1:/t"+Integer.toBinaryString(a>>>1));
System.out.println("a>>>1:/t"+(a>>>1));//无符号右移
// byte y=a<<(byte)1; #error:不兼容的类型: 从int转换到byte可能会有损失。 应该将右式整体进行强制转化为byte类型。
输出结果:
a: 11111111111111111111111111110000
a>>1: 11111111111111111111111111111000
a<<1: 11111111111111111111111111100000
a>>>1: 1111111111111111111111111111000
a>>>1: 2147483640
移位运算符的返回值是int型或者unsigned int类型<实质是最高位是0的int类型的数>,即便运算数是byte类型。
类似byte a = (byte)16<<3
是错误的,因为赋值号右边得到的是int类型,而左边是byte,应该添加强制转换。
扩展运算符
- 偷懒运算符: 扩展运算符无需强制转化就可以从int转为byte类型。
- 助记: 是+=,而不是=+,=+不是等于一个正数吗,会混淆的。
b+=a
与b=b+a
的区别是前者的数据类型为b的数据类型,而后者的数据类型要求a能够自动转换为b的数据类型才能不报错。
int a = 1;
byte b = 1;
b += a; //隐含强制转化,此时b=2,为byte类型。
// b = a+b;此语句错误,右式自动转化我int类型,而int无法自动转化我byte,此处缺少强制转化。
字符串连接符 +
- + 既是正号,也是加号,还是字符串连接符。这三个用途很容易区分,那么如何判定它们的优先级呢?尤其是字符串连接符和加号!
- 我的理解: 字符串连接符和加号是相同优先级从左到右计算。当+的一边操作数为字符串时,会将另一半的操作数自动转化为字符串类型。所以,在一系列的字符串和数值类型的“加法”中,当出现第一个字符串后,可以说,后面的所有数值类型都会自动转换为字符串类型,除非有括号提高它们的优先级,不然,仅有第一个字符串出现前的数值类型的加号执行的是数值的加减。
int x = 10;
int y = 20;
int z = 30;
System.out.println(""+x+y);
System.out.println(x+y+"");
System.out.println(x+y+""+z);
输出结果:
1020
30
3030
条件运算符
value=x?y:z
其中x是boolean值,若为true,返回y.若为false,返回z。
- 助记: 先true,再false。和正常人逻辑相同。
运算符优先级
- 单目运算符优先级高于多目运算符
- 算术运算符 > 位运算符 > 关系运算符 > 逻辑运算符
- 所谓功夫再高,也怕菜刀。要想不出错,最好多用括号。
原创文章,作者:Carrie001128,如若转载,请注明出处:https://blog.ytso.com/274459.html