表达式自动提升类型
在程序中出现直接写出来的数字,如果是整数默认类型为int; 如果为小数默认类型为double.
一个表达式中包含多种数据类型时,结果的数据类型会自动提升,规则如下:
-
byte, short, char 自动提升为int
-
整个表达式的类型提升到最高级的数据类型
float f1 = 3.14F; //直接写3.14这样的小数, 默认类型为double int i1 = 2147483647; //直接写一个整数的数字, 默认类型为int byte b1 = 3; byte b2 = 2; int sum1 = b1 + b2; //b1 和 b2 自动提升类型为int short s1 = 3; short s2 = 2; int sum2 = s1 + s2; //s1, s2 自动提升类型为int char c1 = '1'; char c2 = '2'; int sum3 = c1 + c2; //c1, c2 自动提升类型为int System.out.println(sum3); long l1 = 8; //以为表达式中有一个long类型的加数, 所以整个表达式的结果提升为long long sum4 = l1 + s1 + b1; // 练习: short s3 = 5; // s3 = s3 - 2; //表达式中的2是int, 表达式的结果为int, 这个语句语法是错误的
字面量(直接量)
在代码中直接出现的数字或者字符串,叫做字面量
// 字面量 int m = 20; //20称为字面量 float f5 = 3.14F; //3.14称为字面量 String str1 = "字符串"; //字符串 称为字面量
自动装箱和自动拆箱
每一种基本类型都对应一种包装类型(类),基本类型与包装类型之间可以自动转换,
从基本类中转到包装类型称为自动装箱、
从包装类型转到基本类型称为自动拆箱
基本类型 | 包装器类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
int i = 10; Integer integer = i; //基本类型直接赋值给包装类型, 自动装箱 int i2 = integer; //包装类型直接赋值给基本类型, 自动拆箱 //包装类型的常用方法 String str = "123"; Integer value = Integer.valueOf(str); //把字符串转换为Integer类型 System.out.println(1 + value); int i1 = Integer.parseInt(str); //把字符串转为int类型 System.out.println(2 + i1);
Java里的数据类型
运算符
运算符是一种特殊的符号,用于数据计算、赋值和比较。运算符将多个操作数连接在一起,就成为了表达式。
Java运算符包含以下几类:
-
算术运算符
-
赋值运算符
-
比较运算符
-
逻辑运算符
-
位运算符
-
三目运算符
算术运算符
Java里的算术运算符包含:+ - * / % ++ --
-
+运算符除了数学的相加的作用外, 还可以用于字符串的拼接
int sum1 = 3 + 2; String str1 = "加法的和等于:" + sum1; //+用于字符串,自动把后面int类型的数字转为字符串 System.out.println(str1); String str2 = sum1 + "这个数是和"; //字符串和其它类型拼接时顺序无关 System.out.println(str2); String str3 = "字符串与布尔类型拼接" + true; //字符串可以和所有的基本数据类型拼接 System.out.println(str3);
-
-做减法运算
-
*做乘法运算
-
/做除法运算
整除的结果也为整数(舍弃小数部分); 整除时不能用0做除数
浮点数相除结果有小数;浮点数相除时可以用0作为除数,结果时Infinity
```java int res1 = 8 / 4; System.out.println("8/4: " + res1); res1 = 8 / 3;
// 两个整数相除,得到的结果是整数,舍弃小数部分 System.out.println("8/3: " + res1); // res1 = 8 / 0; // System.out.println("8/0:" + res1); //整除不能用0做除数,会抛出异常
double res2 = 8 / 2.5; //只要有一个操作数为小数,除出来结果就是小数 System.out.println("8/2.5: " + res2); res2 = 10 / 3.0; System.out.println("10/3.0:" + res2); //10/3.0:3.3333333333333335 res2 = 5.0 / 0; //浮点数除法,除数可以为零,得到的结果是Infinity(无穷大) System.out.println("5.0/0:" + res2); //5.0/0:Infinity ```
-
%模运算用于得到除法的余数
整数取模,除数不能为0
小数取模,除数可以为0, 得到的结果是NaN(Not a Number)
// 取模运算 res1 = 5 % 3; //结果是余数 System.out.println("5%3: " + res1); // res1 = 5 % 0; //模运算也不能用0作为除数 // System.out.println("5%0:" + res1); res2 = 5.1 % 0; System.out.println("5.0%3:" + res2);
-
++称为单目运算符(只有一个操作数),自己加1, 可以放在操作数左边或右边、
--称为弹幕运算符,自己减1,可以放在操作数的左边或右边
int k = 1; /*自加1, ++在后面,操作数先参与运算,然后再加1 等效于: res1 = 5 + k; k = k + 1; */ res1 = 5 + k++; System.out.println(res1); // 6 System.out.println(k); //2 int j = 1; /*j自加1, ++在前面,先自加,再参与表达式运算 * 等效于: j = j + 1; * res1 = 5 + j; * */ res1 = 5 + ++j; System.out.println(res1);//7 System.out.println(j); //2
赋值运算符
-
= 赋值运算, 把=右边的结果赋给左边的变量。右边的值可以是字面量,表达式,变量,方法调用
int n = 5; //赋值字面量 n = 3 + 2; //赋值表达式 n = k - j; //赋值含有变量的表达式 Scanner scanner = new Scanner(System.in); // n = scanner.nextInt(); //赋值一个方法返回值 System.out.println(n = 4 + 6);//10, 赋值语句会返回结果
-
扩展(组合)的赋值运算符
+= -= *= /= %= 有算术运算符和赋值运算符组合而成的
n = n + 2; n += 2; // n = n + 2 n -= 2; // n = n -2 n *= 2; // n = n * 2 n /= 2; // n = n / 2 n %= 2; // n = n % 2
比较运算符
用于判断两个操作数的大小或是否相等,返回的值是布尔型。包含:
> < == >=(大于或等于) <=(小于或者等于) !=
System.out.println(3 > 2); //true System.out.println(3 < 2); //false System.out.println(2 == 2); //true System.out.println(2 != 2); //false System.out.println(3 >= 3); //true System.out.println(3 <= 5); //true
逻辑运算符
-
&& 短路与
-
& 与
-
|| 短路或
-
| 或
-
! 非
-
^ 异或
System.out.println("----------逻辑运算---------"); //&& 两个操作数都为true, 结果才为true System.out.println(true && true); System.out.println(true && false); n = 1; //短路与, 如果根据第一个操作数就能觉得表达式的结果,那么第二个表达式不会再执行 System.out.println(false && (2 == ++n));//第一个操作数是false, 所以后面的表达式(2 == ++n)不会被执行, n还是1 System.out.println(n); System.out.println(true & true); System.out.println(false & true); int m = 1; System.out.println(false & (2 == ++m)); System.out.println(m); // || , | 只要有一个为true,就返回true System.out.println(true || true);//true System.out.println(false || true);//true System.out.println(false || false); //false // 求反, true变false; false变true System.out.println(!true); System.out.println(!false); System.out.println(!(2 == 2));// 等效于 2 != 2 //^ 异或, 只有两个操作数不同时返回true, 相同(都true, 都false)返回false System.out.println(true ^ false);//true System.out.println(false ^ false);//false System.out.println(true ^ true);//false
位运算符
-
& 按位与
-
| 按位或
-
~ 按位非
-
^ 按位异或
-
<< 向左移位
-
> > 向右移位
-
>>> 无符号右移
System.out.println("---------位运算符------------"); int a = 5; // 101 int b = 7; // 111 System.out.println(a & b); //5, 101 System.out.println(a | b); //7, 111 a = -5; System.out.println(~a);// 4 a = 5; System.out.println(a ^ b);//2, 010 /* * 面试题:请用性能最优的方法计算: 2 * 8 * */ a = 2; System.out.println(a << 3);//16, 二进制10 左移3位 得到二进制 10000 System.out.println(5 >> 2); System.out.println(-5 >>> 2);
三目运算符
三目运算符用于两分支的判断,等效于if else语句
语法: 条件表达式 ?为真值 :为假的值
res1 = 3 > 5 ? 100 : 0; System.out.println(res1);
-
练习: 从控制台输入两个整数, 打印出较大的数
Scanner scanner = new Scanner(System.in); System.out.println("输入一个整数:"); int i = scanner.nextInt(); System.out.println("输入一个整数:"); int m = scanner.nextInt(); // 如果i大于m, 返回i; 如果i小于m, 返回m int res1 = i > m ? i : m; System.out.println(res1);
运算符的优先级
括号 > 单目运算符 > 算术运算 > 比较运算符 > 逻辑运算符 > 三目 > 赋值
/* * 第一步,计算括号: 5 * ++a == 8 ? true : false * 第二步,计算++: 5 * 6 == 8 ? true : false * 第三步,计算* : 30 == 8 ? true : false * 结果:false * */ a = 5; System.out.println((3 + 2) * ++a == 8 ? true : false);