在Java编程中,不同类型的数据之间经常需要进行相互转换,Java根据数据类型的特点和转换的安全程度,将类型转换分为自动类型转换和强制类型转换两大类,同时还包含引用数据类型的转换场景。

基本数据类型的自动类型转换
自动类型转换也叫隐式类型转换,是指不需要开发者手动编写转换代码,Java编译器会自动将取值范围小的数据类型转换为取值范围大的数据类型。这种转换是安全的,不会出现数据丢失的情况。
自动类型转换的触发条件:两种数据类型相互兼容,且目标类型的取值返回大于源类型。
自动类型转换的兼容规则
- byte、short、char类型在参与运算时会自动提升为int类型
- int类型可以自动转换为long、float、double类型
- long类型可以自动转换为float、double类型
- float类型可以自动转换为double类型
自动类型转换示例
public class AutoTypeCast {
public static void main(String[] args) {
// byte转int
byte b = 10;
int i = b;
System.out.println("byte转int结果:" + i);
// int转long
int num = 100;
long l = num;
System.out.println("int转long结果:" + l);
// int转double
int score = 95;
double d = score;
System.out.println("int转double结果:" + d);
// char转int
char c = 'A';
int charInt = c;
System.out.println("char转int结果:" + charInt);
}
}
基本数据类型的强制类型转换
强制类型转换也叫显式类型转换,是指开发者需要手动编写转换代码,将取值范围大的数据类型转换为取值范围小的数据类型。这种转换可能会导致数据丢失或者精度下降,需要谨慎使用。
强制类型转换的语法格式:(目标类型) 源数据
强制类型转换的注意事项
- 强制转换可能导致数据溢出,比如将大的int值转换为byte时,超出byte范围的部分会被截断
- 浮点数转换为整数时,会直接舍弃小数部分,不会进行四舍五入
- boolean类型不能和其他基本数据类型进行相互转换
强制类型转换示例
public class ForceTypeCast {
public static void main(String[] args) {
// double转int
double d = 12.78;
int i = (int) d;
System.out.println("double转int结果:" + i); // 输出12,小数部分被舍弃
// long转short
long l = 200;
short s = (short) l;
System.out.println("long转short结果:" + s);
// 数据溢出示例
int bigNum = 130;
byte b = (byte) bigNum;
System.out.println("int转byte溢出结果:" + b); // 输出-126,发生数据溢出
}
}
引用数据类型的类型转换
引用数据类型的转换主要针对具有继承或者实现关系的类、接口,同样分为自动向上转型和强制向下转型。
向上转型
向上转型是指将子类对象赋值给父类引用,属于自动类型转换,不需要手动编写转换代码,转换后只能调用父类中定义的属性和方法,不能调用子类特有的方法。
class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
public void bark() {
System.out.println("狗汪汪叫");
}
}
public class UpCast {
public static void main(String[] args) {
// 向上转型,自动转换
Animal animal = new Dog();
animal.eat(); // 调用子类重写的方法,输出"狗吃骨头"
// animal.bark(); 编译报错,不能调用子类特有方法
}
}
向下转型
向下转型是指将父类引用转换为子类类型,属于强制类型转换,需要手动添加转换代码,转换前需要使用instanceof关键字判断引用指向的对象是否是目标类型的实例,否则可能出现ClassCastException异常。
public class DownCast {
public static void main(String[] args) {
Animal animal = new Dog();
// 向下转型前先判断
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.eat();
dog.bark(); // 可以调用子类特有方法
}
// 错误的向下转型示例
Animal anotherAnimal = new Animal();
// Dog wrongDog = (Dog) anotherAnimal; 运行时会抛出ClassCastException
}
}
常见类型转换工具方法
在实际开发中,经常会遇到字符串和基本数据类型的相互转换,Java也为这些场景提供了对应的工具方法。
| 转换场景 | 实现方法 |
|---|---|
| 字符串转int | Integer.parseInt(String str) |
| 字符串转double | Double.parseDouble(String str) |
| int转字符串 | String.valueOf(int num) 或 Integer.toString(int num) |
| double转字符串 | String.valueOf(double num) 或 Double.toString(double num) |
public class StringTypeCast {
public static void main(String[] args) {
// 字符串转基本类型
String strNum = "123";
int intNum = Integer.parseInt(strNum);
System.out.println("字符串转int结果:" + (intNum + 1));
String strDouble = "45.67";
double doubleNum = Double.parseDouble(strDouble);
System.out.println("字符串转double结果:" + (doubleNum * 2));
// 基本类型转字符串
int a = 100;
String strA = String.valueOf(a);
System.out.println("int转字符串结果:" + strA);
}
}
类型转换是Java开发中的基础操作,开发者需要清楚不同转换方式的适用场景和风险,尤其是强制类型转换和向下转型,一定要做好校验,避免出现运行时异常。