1. 类型转换
1.1 自动类型转换
自动类型转换:容量小的数据类型可以自动转换为容量大的数据类型
- 例如: short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float数据类型的位数为32,可以自动转换为64位的double类型。
【演示】
public static void main(String[] args) {
// 定义一个char类型
char c1 = 'a';
// char类型自动转换位int
int i1 = c1;
System.out.println("char自动类型转换位int后的值等于" + i1);
// 定义一个char类型
char c2 = 'A';
// char类型和int类型计算
int i2 = c2 + 1;
System.out.println("char类型和int计算后的值等于: " + i2);
}
1.2 强制类型转换
- 强制类型转换,又被称为造型,用于显式的转换一个数值的类型.
- 强制类型转换可能造成精度降低或溢出。
语法:
强制类型转换的语法格式: (type)var ,运算符“()”中的type表示将值var想要转换成的目标数据类型。 条件是转换的数据类型必须是兼容的。
【演示】
public static void main(String[] args) {
double x = 3.14;
int nx = (int) x;
System.out.println("nx = " + nx);
char c = 'a';
int d = c + 1;
System.out.println("d = " + d);
System.out.println("(char) " + d + " = " + (char) d);
}
1.3 强制类型转换可能丢失信息
当将一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个完全不同的值,溢出。
示例:
public static void main(String[] args) {
int x = 300;
System.out.println((byte) x); //44
}
1.4 常见错误和问题
- 操作比较大的数时,要留意是否溢出,尤其是整数操作时;
public static void main(String[] args) {
//10亿
int money = 1000000000;
int years = 20;
//返回的是负数
int total = money * years;
//返回的仍然是负数。默认是int,因此结果会转成 int值,再转成long。但是已经发生了数据丢失
long total1 = money * years;
//先将一个因子变成long,整个表达式发生提升。全部用long来计算。
long total2 = money * ((long) years);
System.out.println("total = " + total);
System.out.println("total1 = " + total1);
System.out.println("total2 = " + total2);
}
- L和l 的问题:
- 不要命名名字为l的变量
- long类型使用大写L不要用小写。
示例:
public static void main(String[] args) {
// 不要用l命名变量, 看着很像1
int l = 2;
// 需要用大写L表示long类型
long a = 23451L;
}
2. JDK7扩展
JDK7新特性: 二进制整数
- 由于我们在开发中也经常使用二进制整数,因此JDK7为我们直接提供了二进制整数的类型。我们只要以:0b开头即可。
示例:
public static void main(String[] args) {
System.out.println("二进制: 0101 = " + 0b0101);
}
JDK7新特性:下划线分隔符
- 在实际开发和学习中,如果遇到特别长的数字,读懂它令人头疼!JDK7为我们提供了下划线分隔符,可以按照自己的习惯进行分割。
示例:
public static void main(String[] args) {
System.out.println("1_2345_7893 = " + 1_2345_7893);
}