目录
1.类型转换
类型转换分类 | 简介 | 优点 | 缺点 |
自动类型转换(隐式) | 即代码不需要经过任何处理,在代码编译时,编译器会自动进行处理 | 数据范围小的转为数据范围大的时会自动进行 | |
强制类型转换(显式) | 即当进行操作时,代码需要经过一定的格式处理,不能自动完成 | 数据范围大的到数据范围小的 | ①不一定能成功 ②可能会造成精度丢失 |
1.1 自动类型转换(隐式)
代码1-1:
public static void main(String[] args) {
int a = 6;
long b = 66L;
b=a;//6 a的范围小于b,编译器会自动将a提升为long类型,然后赋值
a=b;
System.out.println(a);
}
由运行结果可以看出,当b的值赋给a时,编译报错,这是因为long的范围大于int,会有数据丢失,不安全。
当然由此我们也可以看出Java中不同类型之间的变量相互赋值的时候,会有严格的校验。
代码1-2:
public static void main(String[] args) {
//byte a1 = 66;//66 编译通过,66在byte的范围内,编译器会将66转换为byte
byte a2 = 666;
System.out.println(a2);
}
看运行结果,编译失败,因为666默认为int,超过了byte的范围,有数据丢失。
1.2 强制类型转换(显式)
代码1-3:
public static void main(String[] args) {
float a = 1.1F;
double b = 100.1;
a = (float)b;
System.out.println(a);
}
当double->float时,数据范围由大到小,要想编译成功,需要强制转换。
代码1-4:
public static void main(String[] args) {
int d = 2;
double m= 3.4;
d = (int)m;
System.out.println(d);
}
运行结果如下:
结果是3,这是因为int没有double表示的数据范围大,需要强转,小数点后全部丢弃。
代码1-5:
public static void main(String[] args) {
byte b = (byte)128;
System.out.println(b);
}
运行结果如下:
128默认为int,超过byte范围,要想编译成功,需要显式转换。
那么为什么是-128呢?
让我们画个圆解释一下:
byte类型的最大值为127,当超过这个最大值时,就会到-128这个值(数值会按照这个圆的顺时针方向增减。)
代码1-6:
public static void main(String[] args) {
boolean flag = true;
int a = 2;
a = flag;
System.out.println(a);
}
运行结果如下:
编译失败,类型不兼容
注:
①将一个字面值常量进行赋值时,Java会自动针对数字范围进行检查。
②不相干的类型不能互相转换。
2.类型提升
不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。
2.1 int与long
int会被提升为long
代码2-1:
public static void main(String[] args) {
int a = 10;
long b = 100L;
long c = a+b; //编译成功,a+b=int+long-->long+long
int d = a+b;
System.out.println(d);
}
运行结果如下:
int c = a + b = int + long = long + long
此时的结果是long类型,赋值给int时会丢失数据。
2.2 byte与byte
代码2-2:
public static void main(String[] args) {
byte a = 1;
byte b = 2;
byte c = a+b;
System.out.println(c);
}
运行结果如下:
为什么byte和byte相同类型,却出现编译报错呢?
这是因为a+b在运算时会将a+b都提升为int再进行计算,即 int + int = int,此时的结果为int型,赋值给byte型,当然就报错了。
那么下面看正确写法:
代码2-3:
public static void main(String[] args) {
byte a = 2;
byte b = 3;
byte c = (byte)(a+b);
System.out.println(c);
}
小结:
①不同类型的数据混合运算,范围小的会提升成范围大的。
②对于short,byte这种比4个字节小的类型,会先提升成四个字节的int,再运算。
3.字符串类型(使用String类定义)
代码3-1:
public static void main(String[] args) {
String s1 = "hahaha";
String s2 = "lalala";
System.out.println(s1);
System.out.println(s2);
System.out.println(s1+s2);//s1+s2表示将s1和s2拼接
}
运行结果如下:
在一些情况下,需要将字符串和整形数字之间进行转换:
①int转换为String
代码3-2:
public static void main(String[] args) {
int a = 10;
String s1 = String.valueOf(a);
System.out.println(s1);
String s2 = a+"";//当字符串和其他类型进行相加的时候,结果就是字符串
System.out.println(s2);
}
运行结果如下:
②String转换成int
代码3-3:
public static void main(String[] args) {
String str3 = "123";
int ret = Integer.parseInt(str3);
System.out.println(ret);
}
运行结果如下:
看下面这个代码:(考虑运算顺序)
代码3-4:
public static void main(String[] args) {
int c = 20;
int d = 7;
System.out.println("c = "+c +", d = "+d);
System.out.println(c+d +" hello");//27 hello
System.out.println("hello"+c+d);//hello207
System.out.println("hello"+(c+d));//hello27
}
运行结果如下: