上篇说到Java中的变量与常量,接下来就是简单的计算了,首先需要了解一下Java中的运算符。
六、运算符
1. 赋值运算符
赋值运算符即“=”,是一个二元运算符(即对两个操作数进行处理),其功能是将右方操作数所含的值赋值给左方的操作符。其中左方必须是一个变量,而右边所赋的值可以使任何数值或表达式,例子如下:
int a = 10; // 将10赋给a
int b = 5; // 将5赋给b
int c = a+b; // 将变量a和b进行运算后的结果赋给c
也可先定义变量再进行赋值运算,如:
int a, b, c; // 声明int型变量a、b、c
a = 10; // 将10赋值给变量a
c = b = a + 5; // 将a+5赋值给变量b、c
在Java中可以把赋值运算连在一起使用,比如上方b、c的运算结果都为15。
2. 算数运算符
Java中的算数运算符主要有+、-、*、/和%,分别为加、减、乘、除和求余,都是二元运算符。注意除法运算时,0不能作为除数。
1 public class Arith {
2
3 public static void main(String[] args) {
4 float num1 = 52.56f; // 声明float型变量并赋值
5 int num2 = 512; // 声明int型变量并赋值
6
7 System.out.println("num1 + num2 = " + (num1 + num2)); // 将变量相加并输出
8 System.out.println("num2 - num1 = " + (num2 - num1)); // 将变量相减并输出
9 System.out.println("num1 * num2 = " + num1 * num2); // 将变量相乘并输出
10 System.out.println("num1 / num2 = " + num1 / num2); // 将变量相除并输出
11 }
12 }
运行结果如下:
3. 自增和自减运算符
自增、自减运算符是单目运算符(只有一个操作数),可以放在操作数之前,也可以放在操作数之后。操作数必须是一个整型或浮点型变量。自增自减的作用是将变量的值加一或减一,放在操作数前后的作用不同,考试中最常出现的考题之一,需加以区分。
若自增(自减)运算符在操作数之前,如++a(--a)表示先使a的值加一(减一),再使用变量;若自增(自减)运算符在操作数之后,如--a(--a)表示先使用变量a,再对其进行加一(减一)操作,下面看一个例子:
1 public class Example {
2
3 public static void main(String[] args) {
4 int a; // 声明变量a
5
6 a = 4; // 赋值为4
7 System.out.println("++a后的值为:" + ++a); // 输出++a的值
8
9 a = 4; // 同样赋值为4(重新赋值,放止a的值已经发生改变)
10 System.out.println("a++后的值为:" + a++); // 输出a++的值
11 }
12
13 }
不妨先猜测一下结果是什么,运行结果如下:
为什么会出现两个不同的答案呢?a的值为4,++a相当于先对a进行自增再输出,也就是执行输出时,a的值已经变为5了;而a++相当于先输出a的值再自增,也就是先输出a的值为4,然后再对a进行自增,此时a为5,但4已经输出了,所以会出现这两个结果。
4. 比较运算符
比较运算符属于二元运算符,用于变量与变量之间、变量与常量之间及其它类型的信息之间的比较,运算结果是boolean型,当运算符对应关系成立时,运算结果为true,否则结果为false。
常见比较运算符有>(比较左是否大于右)、<(比较左是否小于右)、>=(比较左是否大于等于右)、<=(比较左是否小于等于右)、==(比较左是否等于右)、!=(比较左是否不等于右)。这里要特别注意,“=”是赋值运算符,“==”才是比较运算符。
1 public class Compare {
2
3 public static void main(String[] args) {
4 int num1 = 4;
5 int num2 = 5;
6
7 System.out.println("4<5: " + (num1 < num2)); // 判断4小于5是否成立
8 System.out.println("4>5: " + (num1 > num2)); // 判断4大于5是否成立
9 System.out.println("4==5: " + (num1 == num2)); // 判断4等于5是否成立
10 System.out.println("4!=5: " + (num1 != num2)); // 判断4不等于5是否成立
11 System.out.println("4>=5: " + (num1 >= num2)); // 判断4大于等于5是否成立
12 System.out.println("4<=5: " + (num1 <= num2)); // 判断4小于等于5是否成立
13 }
14
15 }
上述程序的运行结果如下:
5. 逻辑运算符
逻辑运算符包括&&(&)(逻辑与)、||(|)(逻辑或)和!(逻辑非),返回值为布尔类型,操作元也必须是布尔类型数据。其中除了“!”是一元运算符外,其余的都是二元运算符。逻辑与是左右两个表达式都为true,逻辑结果才为true;逻辑或是左右两个表达式有一个或两个表达式为true时,逻辑结果才为true。
这里就有个小知识点了,&&(||)和&(|)有什么区别呢?
以“&&”和“&”为例,这两个符号都是逻辑与,当左右两个表达式都为true时,逻辑结果才为true。使用“&”时,左右两边都会判断;而使用“&&”时,如果“&&”左边的表达式结果为false,那么计算机就不会再判断右边的结果了,直接返回逻辑结果为false,这就是它们的区别。“||”则是左边判断为true时,就不会再判断右边,而“|”两边都会判断。使用“&&”和“||”可以节省计算机判断的次数,提高效率,通常被称为“短路”,而“&”和“|”被称为“非短路”。
6. 位运算符
位运算符用于处理整型和字符型的操作数,对其内存进行操作,数据在内存中以二进制形式表示(这里二进制的表示不做过多说明,相信学计算机的朋友们都非常了解二进制存储及数据表示)。主要有~(按位取反)、&(按位与)、|(按位或)、^(安慰异或)、<<(左移)、>>(右移)、>>>(无符号右移)。
48<<1 就是将48的二进制数向左移1位,结果为96。移位可实现整数除以或乘以2的n次方的效果,例如 y<<2 与y*4的结果相同,4就是2的二次方, y>>1
7. 三元运算符
boolean b = 50 < 30 ? true : false;
int i = 21;
int j = 47;
int z = i<j ? 100 : 200;
这里首先判断i<j是否成立,如果成立,z的值就是100,如果不成立,z的值就是200,因为21<47成立,所以z=100。
8. 运算符优先级
Java中表达式就是使用运算符连接起来的符合Java规则的式子,运算符的优先级决定了表达式中运算执行的先后顺序。下面是一张运算符优先级的表:
优先级 | 运算符 |
1 | ( ) |
2 | +、- |
3 | ++、--、! |
4 | *、/、% |
5 | +、- |
6 | >>、>>>、<< |
7 | <、>、>=、<= |
8 | ==、!= |
9 | & |
10 | ^ |
11 | | |
12 | && |
13 | || |
14 | ? : |
15 | = |
如果两个运算符有相同的优先级,那么左边的表达式要比右边的先处理。
七、类型转换
1. 自动类型转换
Java中的8中基本类型可以混合使用,那必然会出现一个类型转换的问题,不同类型的数据在运算过程中首先会自动转换为同一类型再进行运算。自动类型转换遵循低级到高级转换的规则(占用空间越小级别越低)。
例如:
float num1 = 45f;
int num2 = 120;
System.out.println(num1 + num2);
这里系统首先将int型变量转换成float型变量之后再相加,所以输出为float型,结果是165.0。隐式转换规则见下表:
操作数1的数据类型 | 操作数2的数据类型 | 转换后的数据类型 |
byte、short、char | int | int |
byte、short、char、int | long | long |
byte、short、char、int、long | float | float |
byte、short、char、int、long、float | double | double |
2. 强制类型转换
当把高精度的变量的值赋给低精度的变量时,必须使用显式类型转换运算(又称强制类型转换),如把double、float型转换成int、long型如下:
int a = (int)42.56; // 此时a输出为42
long b = (long)467.5f // 此时b输出为467
但要注意的是,不可超出变量的取值范围,否则会数据溢出,如下方代码,由于byte型变量最大值为127,而427已经超出其取值范围,因此会发生数据溢出,造成了数据的丢失。boolean型不能转换。
short s = 427;
byte b = (byte)s;
以上就是Java语言基础的所有内容,下一篇将介绍Java中的流程控制。