JAVA基础语法(二)

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+=ab=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。和正常人逻辑相同。

运算符优先级

  • 单目运算符优先级高于多目运算符
  • 算术运算符 > 位运算符 > 关系运算符 > 逻辑运算符
  • 所谓功夫再高,也怕菜刀。要想不出错,最好多用括号。
posted @ 2022-07-15 02:31  WordDealer  阅读(29)  评论(0编辑  收藏  举报