1.算术运算符
表格中的例子中,变量a的值为5,变量b的值为3,变量i的值为1:
- 前缀自增自减法(++i,--i): 先进行自增或者自减运算,再进行表达式运算。
- 后缀自增自减法(i++,i--): 先进行表达式运算,再进行自增或者自减运算。
2、位运算符
(1)位运算时先转换为二进制,再按位运算。
(2)表格中的例子中,变量a的值为60,变量b的值为13:
注:(1)左移运算符:
丢弃最高位,0补低位
如果运算数小于int这先转换为int后运算
左移的位数是对数据类型的位数取模(例如:对int左移32位相当于左移了
32%32=0位)
在数字没有溢出的情况下,左移1位相当于乘2
(2)右移运算符:
丢弃最低位,高位符号位扩展(保留符号位sign extension)
如果运算数小于int这先转换为int后运算
右移的位数是对数据类型的位数取模(例如:对int左移32位相当于右移了
32%32=0位)
在数字没有溢出的情况下,右移1位相当于除2
3、逻辑运算符
(1)逻辑运算符时通过运算符将操作数或等式进行逻辑判断的语句。
(2)表格中的例子中,假设布尔变量a为真,变量b为假:
4、赋值运算符
(1)将右边的操作数或运算结果赋值给左边的操作数。
(2)
5、关系运算符
(1)表格中的例子中,假设变量a为3,变量b为5:
(2)== 和 !=适用于所有的基本数据类型,其他关系运算符不适用于boolean,因为boolean的值只有true和false,比较没有任何意义。
(3)== 和!=也适用于所有对象,可以比较对象的引用是否相同。
(4)引用:Java中一切都是对象,但操作的标识符实际是对象的一个引用
例如:《1》String s;
创建的是引用,不是对象。创建引用后,一种安全的做法是对其进行初始化。
《2》 String s = “abc”;
String s = new String("abc");
通常采用new操作符生成一个新对象,然后将引用于该对象相关联。
《3》
public class Test {
public static void main(String args[]) {
Integer n1 = new Integer(2);
Integer n2 = new Integer(2);
System.out.println(n1 == n2);
System.out.println(n1 != n2);
}
}
结果是: false
true
原因:尽管两个对象的内容相同,但是它们的引用却不相同,==和!=比较的是对象的引用。
(4)比较对象的内容是否相同,用 equals(),但它不适用于基本类型
public class Test {
public static void main(String args[]) {
Integer n1 = new Integer(2);
Integer n2 = new Integer(2);
System.out.println(n1.equals(n2));
}
}
输出结果:
true
但是当自己创建了一个类时,情况又会相反,因为equals()默认比较引用,除非在自己的类中覆盖equal()方法
6、条件运算符
(1)条件运算符?: 是唯一一个三目运算符。
(2)语法形式:布尔表达式?表达式1 : 表达式2
运算过程:
如果布尔表达式的值为true ,则返回 表达式1 的值,否则返回 表达式2 的值。
7、instanceof运算符
(1)用于操作对象实例,检查该对象是否是一个特定类型(类类型或借口类型)
(2)使用格式:
( Object reference variable ) instanceof (class/interface type)
如果运算符左侧变量所指的对象,是操作符右侧类或接口(class/interface)的一个对
象,那么结果为真。
String name = "James";
boolean result = name instanceof String;
// 由于 name 是 String 类型,所以返回真