JAVA中,类型转换是将一种数据类型转换为另一种数据类型。根据转换的方式可以为分为隐式转换和显式转换。
一、隐式转换
不需要显示声明,JAVA会自动将一种数据类型转换为另一种数据类型。这种转换的前提是数据类型“由小转大”——数据容量小的转换为数据容量大的。就好比一个人住在10平的房间,现在需要他住在100平的房间,这个人(数据)是不会发生变化的,人的大小(数据精度)不会发生丢失。
常见的隐式转换:
public static void main(String[] args) {
//1、byte-->int
byte byteNum = 10;
int intNum = byteNum;
System.out.println("byte-->int: byteNum=" + byteNum + ",intNum=" + intNum);
//2、byte-->short
short shortNum = byteNum;
System.out.println("byte-->short: byteNum=" + byteNum + ",shortNum=" + shortNum);
//3、short-->int
int intNum2 = shortNum;
System.out.println("short-->int: shortNum=" + shortNum + ",intNum2=" + intNum2);
//4、int-->long
long longNum = intNum2;
System.out.println("longNum = intNum2: intNum2=" + intNum2 + ",longNum=" + longNum);
//5、int-->float
float floatNum = intNum2;
System.out.println("floatNum = intNum2: intNum2=" + intNum2 + ",floatNum=" + floatNum);
//6、float-->double
float floatNum2 = 3.14f;
double doubleNum = floatNum2;
System.out.println("float-->double: floatNum2=" + floatNum2 + ",doubleNum=" + doubleNum);
//7、char-->int
char charNum = 'A';
int charIntNum = charNum;
System.out.println("char-->int: charNum=" + charNum + ",charIntNum=" + charIntNum);
}
输出如下:
byte-->int: byteNum=10,intNum=10
byte-->short: byteNum=10,shortNum=10
short-->int: shortNum=10,intNum2=10
longNum = intNum2: intNum2=10,longNum=10
floatNum = intNum2: intNum2=10,floatNum=10.0
float-->double: floatNum2=3.14,doubleNum=3.140000104904175
char-->int: charNum=A,charIntNum=65
在编写的时候就可以发现,当类型转换发生在小精度转大精度的时候,直接转换就行,编译器也不会有提示。
二、显式转换
需要显式声明。这种转换发生在大精度转小精度的时候,因为存在丢失精度的风险,所以编译器会提示你——你需要明白你的操作可能会丢失精度,如果你了解其中的风险,那么需要你显式声明这种转换。
显示转换可以分为两类,一类发生在数值之间的转换,另一类是引用数据类型之间的转换。
(1)、数值显式转换:
public static void forceChange() {
//long-->int
long longNum = 100;
int intNum = (int)longNum;
System.out.println("long-->int,long value = " + longNum + ", int value = " + intNum);
//double-->float
double doubleNum = 3.1415926;
float floatNum = (float) doubleNum;
System.out.println("double-->float,double value = " + doubleNum + ", float valie = " + floatNum);
//double-->int
int intNum2 = (int)doubleNum;
System.out.println("double-->int,double value = " + doubleNum + ", int value = " + intNum2);
}
输出:
long-->int,long value = 100, int value = 100
double-->float,double value = 3.1415926, float valie = 3.1415925
double-->int,double value = 3.1415926, int value = 3
要注意对于高精度的数值强制转换为低精度的数值,会发生丢失精度的情况,如:
double-->int,double value = 3.1415926, int value = 3
(2)、引用类型转换
显式转换通常在父类和子类,接口和实现类之间:
public class ObjChange extends Father{
public static void main(String[] args) {
Father father = new ObjChange();
System.out.println(father.getAge());
}
}
class Father {
int age = 3;
public int getAge() {
return age;
}
}
接口和实现类之间的转换,和集合类的使用是一样的:
//InterfarceObj inter = new ImplementsObj()
List<String> list = new ArrayList<>();
Map<String, String> map = new HashMap<>();