操作符

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a527219336/article/details/50718875

在最底层,Java中的数据是通过使用操作符来操作的。

赋值运算符

  • =

在Java中,基本类型的赋值会改变被赋值变量的值,但是对对象的赋值改变的是引用

class Tank {
    int level;
}

public class Assignment {
    public static void main(String[] args) {
        Tank t1 = new Tank();
        Tank t2 = new Tank();
        t1.level = 9;
        t2.level = 47;
        t1.level = t2.level;//赋值后t1.level,t2.level都为47

        t1 = t2;
        t2.level = 27;//此时t1.level,t2.level都为27,因为上一行中t1=t2让t1、t2都指向了同一个对象
    }
}    

在方法传参数上,传递的对象也是一个引用,而不是形参。

算术操作符

  • +
  • -
  • *
  • /
  • %
  • +=
  • -=
  • *=
  • /=
  • %=
一元加减操作符
  • +
  • -
x=-a;
x=+a;

自动递增和递减

  • 前缀递增、后缀递增(a++,++a)
  • 前缀递减、后缀递减(a–,–a)

关系操作符

  • >
  • <
  • >=
  • <=
  • ==
  • !=
String a = new String("abc");
String b = new String("abc");
a == b;//false
a.equals(b);//true
//==比较的是引用,因为两个字符串是不同的对象,所以结果是false,equals比较的才是值。
class Value {
 int i;
}
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
v1.equals(v2);//false
//此处为什么是false呢,因为equals()的默认行为是比较引用,所以要覆盖equals()方法,另外如果要深入研究hashCode()方法。

逻辑操作符

  • &&
  • ||
  • !
短路原则
  • 对于expression1&&expression2&&expression3,如果左边的运算得到的结果为false,总的结果一定为false,所以下一步运算便不再进行下去
  • 同理expression1||expression2||expression3,如果左边的运算得到的结果为true,总的结果一定为true,发生短路

直接常量

int a = 0x2f;
int b = 0177;
long c = 100L;
float d = 100F;
double e = 100D;
//大小写均可
指数计数法
 float expFloat = 1.39-43f;
 //expFloat的值为1.39*10的-43,e表示的并不是自然对数的基数

按位操作符

  • &
  • |
  • ~
  • ^

移位操作符

  • << 在低位补0
  • >> 在高位按符号补,正数补0,负数补1
  • >>> 高位补0
  • <<=
  • >>=
  • >>>=
public class URShift {
    public static void main (String[] args) {
        int i = -1;
        print(Integer.toBinaryString(i));
        i>>>= 10;
        print(Integer.toBinaryString(i));
        //结果是:
        //11111111111111111111111111111111 32位
        //1111111111111111111111 22位 
        long l = -1;
        print(Long.toBinaryString(l));
        l>>>= 10;
        print(Long.toBinaryString(l));
        //结果是:
        //1111111111111111111111111111111111111111111111111111111111111111  64位
        //11111111111111111111111111111111 1111111111111111111111 54位 
        short s = -1;
        print(Integer.toBinaryString(s));
        s>>>= 10;
        print(Integer.toBinaryString(s));
        //结果是:
        //11111111111111111111111111111111 32位
        //11111111111111111111111111111111 32位
        byte b = -1;
        print(Integer.toBinaryString(b));
        b>>>= 10;
        print(Integer.toBinaryString(b));
        //结果是:
        //11111111111111111111111111111111 32位
        //11111111111111111111111111111111 32位
        b = -1;
        print(Integer.toBinaryString(b));
        print(Integer.toBinaryString(b>>>10));
        //结果是:
        //11111111111111111111111111111111 32位
        //1111111111111111111111 22位

如果对char、byte、short类型的数值进行移位处理,那么在移位进行之前,它们会被自动转换为int类型,并且结果也是int类型。上述的结果倒数二三个例子的结果赋值回byte,short变量中,所以结果被截断了,再打印出来的时候又转成int类型输出,所以结束依然是32位,而最后一个例子运算到的结果得到22位的结果就被直接打印出来了。所以结果没有错。

三元操作符

  • ? :

字符串操作符

  • +
  • +=

类型转换操作符

  • 窄化转换 (显式转换)
  • 扩展转换 (隐式转换)
提升

byte或者short类型的数执行算术运算或按位运算后,值会自动转换成int。如果要把结果赋值给较小的类型,就必须使用类型转换。


以上皆个人学习的总结,如有不对之处,欢迎指出。邮箱:527219336@qq.com

展开阅读全文

没有更多推荐了,返回首页