java 操作符
基础
c++
中没有 >>>(逻辑右移)操作符,这是在java中才有的。c++
想要实现逻辑右移的功能要么进行更复杂的运算要么用unsigned。这篇博客中详细讲了算术右移和逻辑右移
浮点数不支持移位运算。并且如果其中一个浮点数是double型,结果就是double型。
逻辑运算符(部分) | 操作 |
---|---|
&& | 短路与 |
& | 非短路与 |
两竖线 | 短路或 |
一竖线 | 非短路或 |
短路与非短路的区别是对于短路运算符如果左边可以判断,那么就不会去判断右边。非短路运算符无论条件如何都会执行两边。
非短路运算符的作用是有时我们先要进行一些运算再判断,非短路运算符可以确保运算的执行。例如 if(b == true & (output+=10) == 20 ).其中output+=10就是运算,
==操作符在对象中
当==操作符在对象中时,两个引用变量必须是引用同一个对象,结果才为true。
例:Integer int1 = new Integer(1);
Integer int2 = new Integer(1);
Integer int3 = int1;
System.out.println(int1 == int2);
System.out.println(int1 == int3);
output:
false
true
可见哪怕赋了一样的值两个对象还是不同的。
== 与多态
想要使用必须要两个类是相同的或者处于同一分支。例如 cat和dog都继承与animal类,cat可以和animal进行比较,但是cat不能和dog进行比较。
数组也是引用类型,可以用==进行比较,但是前提是两边变量类型必须相同,例如一个int型和一个long型进行比较就会报错。
对象的equal()方法
有些jdk中的一些类覆盖了object类的equal()。这种情况下比较就是如果类型一致且内容一致(数据域),那么就返回true,否则返回false。例如String类。
所以如果要进行字符串比较的话,必须使用equal方法。不然除非是复制的两个字符串,不然即使内容相同也会出错。
instanceof操作符
instanceof操作符用于判断引用类型所引用的对象是否是一个类或其祖先的实例。如果是返回true。
格式: 实例名 instanceof 类名或接口名
例:Dog dog = new Dog();
System.out.println(dog instanceof Dog);
output: true
同时如果Dog替换成dog的父类或祖先类,或Dog类或其祖先实现的接口时,都会返回true
类型转换
自动类型转换
总的规则就是小的和大的相乘结果是大的。浮点数和整数相乘结果是浮点数。
强制类型转换
把高位类型赋值给低位类型,结果一定要进行强制类型转换(显式转换)。由小到大进行自动类型转换。
例 :float f = 3.14;
int i = (int)3.14;
long j = 5;
int i2 = (int)j;
其中只有第一个是不合法的,因为浮点数默认是double型。
此外,如果超过了数据范围也必须强制类型转换。
char c = -1;//错误,因为超过了数据范围
char c = 97;//正确
引用类型的强制转换
子类复制给祖先类,会自动进行类型转换。而父类给子类则必须进行强制类型转换。
如果不在统一继承分支上则不可以进行转换。
例如:Animal cat = new Cat();
Dog dog = (Dog)cat;
上面的代码可以通过编译,但是在运行时会跑出ClassCastException异常