Java类型转换是强类型系统的底层规则,分为自动拓宽(如byte→int)、强制截断(如int→byte)、字符串专用解析(如Integer.parseInt)及引用类型继承转换(需instanceof校验)。

Java 类型转换不是语法糖,而是强类型系统下数据交互的底层规则。理解它,关键在于搞清“为什么能转”和“转了会怎样”,而不是死记转换顺序。
自动转换只发生在安全拓宽路径上
Java 允许小表示能力类型向大表示能力类型隐式转换,因为不会丢失数值(浮点精度例外)。这个“大小”看的是值域范围,不是字节长度——比如 float 虽然只有 4 字节,但能表示比 8 字节 long 更大的数(如 1e38),所以 long → float 是合法的自动转换。
- 标准拓宽路径:byte → short → int → long → float → double
- char 单独一路:char → int(本质是 Unicode 码点提升)
- 混合运算时,所有操作数先提升到表达式中最高级类型再计算。例如 byte a = 1; short b = 2;,执行 a + b 时,两者都先升为 int
强制转换必须显式声明,且自带确定性风险
从大范围转小范围,Java 不替你做决定,因为你可能丢数据。这不是 bug,而是按补码截断的确定行为。
- 语法统一:(目标类型) 表达式,括号不可省略
- int i = 130; byte b = (byte) i; → b = -126(整数溢出只保留低字节)
- (int) 3.9 得到 3,(byte) 200 得到 -56(浮点转整数直接截小数,不四舍五入)
- boolean 不能参与任何类型转换,既不能转数字,也不能被转成其他类型
字符串与基本类型互转必须走专用方法
字符串和其他类型之间没有自动转换关系。"" + num 得到字符串,本质是拼接,不是类型转换;而 Integer.parseInt("123") 才是真正的解析。
立即学习“Java免费学习笔记(深入)”;
- 基本类型 → 字符串:推荐 String.valueOf(x)(空安全)或 Integer.toString(x) 等静态方法
- 字符串 → 基本类型:用 Integer.parseInt()、Double.parseDouble() 等,必须捕获 NumberFormatException
- 不要用 new Integer("123")(已过时),更不要写 (int)"123"(编译不通过)
引用类型转换依赖继承关系,逻辑完全不同
对象之间的转换和数值转换不是一回事,核心是运行时类型检查。
- 向上转型(父类引用指向子类对象):自动、安全,如 Object obj = new String("abc");
- 向下转型(子类引用接收父类变量):必须强制,且运行时验证实际类型,否则抛 ClassCastException
- 稳妥做法:先用 instanceof 判断,再转型,例如 if (obj instanceof String) { String s = (String) obj; }


















