任何的编程语言都有自己的操作符,Java语言也不例外,Java虚拟机会根据操作符的优先级来进行表达式,下图列出了一些操作符的优先级顺序
一、整型操作符
整型操作符可以根据操作元的多少分为一元操作符和二元操作符,一元操作符只对一个操作元进行操作,二元操作符对两个操作元进行操作。
在计算表达式中,如有有一个操作元是long型,那么结果也会是long型,否者不管操作元是byte,short或者是char型,运算结果都将是int型。
public static void main(String[] args) {
byte a=1,b=2;
byte c = a+b;//编译报错,类型不匹配,以下是两种改法
int c = a+b;
byte c = (byte) (a+b);
}
1.一元整型操作符
++和--操作符会改变所作用变量本身的值,-和~不会改变变量本身的值,例如
public static void main(String[] args) {
int a=10,b=10,c=10,d=10,e=10,f=10;
System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+f);
a++;
b--;
e=~c;
f=-d;
System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+f);
}
++和--既可以作为前置操作符也可以作为后置操作符,例如
public static void main(String[] args) {
int a = 0,b = 10,c = 10;
b = ++a;//作为前置操作符,a的值变成1,b的值变成1
c = a++;//作为后置操作符,c的值变成1,a的值变成2
System.out.println(a+" "+b+" "+c);
}
2.二元整型操作符
二元操作符不会改变操作元的值,而是返回可以赋给其他变量的值
二、浮点型操作符
多数的整形操作符也可以作为浮点型操作符,例如++,--,*,/等。如果操作元中最大长度类型为float型,那么结果 为float型;如果操作元中有一个或多个double型,那么结果就是double型。例如
public static void main(String[] args) {
int int1 = 1,int2 = 1;
long long1 = 1,long2 = 1;
float float1 = 1.0f,float2 = 1.0f;
double double1 = 1.0,double2 = 1.0;
int a = int1+int2;//运算结果为int型
long b = int1*int2+long1;//运算结果为long型
float c = int1+int2+long1+float1/float2;//运算结果为float型
double d = int1+int2+long1+float1/float2+double1;//运损结果为double型
}
注意:浮点型是不支持位运算的.
Java中浮点型有两个特殊的值:负无穷大(负数除以零)和正无穷大(正数除以零)例如
public static void main(String[] args) {
System.out.println(1.0/0.0);
System.out.println(-1.0/0.0);
}
三、比较操作符和逻辑操作符
Java语言的比较操作符和逻辑操作符,这些操作符的运算结果都是boolean类型的,除!是一元操作符以外其他都是二元操作符。
<,>,<=,>=操作符的操作元只能是整数类型和浮点类型
==和!=操作符的操作元可以是基本类型也可以是引用类型
&&和&均为与操作符,操作元只能是boolean表达式(boolean表达式为运算结果为boolean类型的表达式),下图为&操作符的运算规则
||和|均为或操作符,操作元只能是boolean表达式(boolean表达式为运算结果为boolean类型的表达式),下图为|操作符的运算规则
&&和||为短路操作符,对于短路操作符,如果能根据左边的boolean表达式就能推算出整个表达式的boolean值,将不执行操作符右边的boolean表达式
&和|为非短路操作符,非短路操作符始终会执行操作符两边的boolean表达式
!为一元操作符,操作元只能是boolean表达式(boolean表达式为运算结果为boolean类型的表达式),当boolean表达式的运算结果为true时运算结果则是false,当boolean表达式的运算结果为false时运算结果为true。
四、特殊操作符?
?为Java语言中的三元操作符,他的语法形式为boolean表达式?表达式1:表达式2,操作符?运算过程为如果boolean表达式的结果为true返回表达式1的值,如果boolean表达式的结果为false返回表达式2的值。
五、字符串连接操作符+
操作符+能连接字符串并生成新的字符串,例如
public static void main(String[] args) {
String a = "123";
String b = "456";
System.out.println(a+b);
}
如果+操作符中有一个是String型,则另一个操作元可以是任意类型,另一个操作元将被替换成为字符串,如果另一个操作元为引用类型,就调用所引用对象的toString()方法来获得字符串。
如果+左右 两个操作元均不是String类型,那么两个操作元必须是除boolean类型以外的基本数据类型,此时+作为加号处理。
多个+操作符表达式,则从左到右开始计算表达式。
六、操作符==与对象的equals()方法
1.操作符==
==用于比较引用类型变量时。==两边的变量被显式声明的类型必须是同种类型或者有继承关系,否则编译报错。
数组类型也是引用类型,可以使用==比较
public static void main(String[] args) {
boolean a1 = new int[4] == new long[5];//编译报错两边类型不一致
boolean b2 = new int[4] == new int[4];//合法
int[] array1 = new int[4];
int[] array2 = array1;
boolean a3 = array1==array2;//合法
}
2.equals()方法
Object类的equals()方法的比较规则为:当参数obj引用的对象与当前对象为同一对象时返回true,否则返回false,例如
public boolean equals(Object object){
if (this==object)return true;
else return false;
}
在实际的运用中,因为字符串比较通常是按照内容比较才会有意义,所以应该调用String类的equals()方法而不是使用==操作符。
七、instanceof操作符
instanceof操作符用于判断一个引用类型所引用的对象是否是一个类的实例。
intstanceof操作符左边的操作元是一个引用类型,右边的操作元是一个类名或接口名。例如
Dog dog = new Dog();
System.out.println(dog instanceof XXX);//XXX表示一个类名或接口名
一个类的实例包括类本身的实例,所有直接或间接的子类的实例,当XXX为这些类型时intstanceof表达式的值为true。
instanceof左边操作元被显式声明的类型和右边操作元必须是同种类型或有继承关系。
数组类型也可以用instanceof进行比较,例如
boolean a1 = new int[4] instanceof long[];//编译报错两边操作元的类型不一致
boolean b2 = new int[4] instanceof int[];//合法