目录

一、自动类型转换

二、强制类型转换

三、基本数据类型和String的转换


一、自动类型转换

取值范围小的类型 自动提升为 取值范围大的类型 。代码不需要进行特殊处理,自动完成。

char → int → long → float → double

byte → short → int → long → float → double

精度小的类型自动转换为精度大的类型

public class AutoConvert {
    public static void main(String[] args) {
        int a = 'a';    // 编译成功
        double b = 10;  // 编译成功
        int n1 = 10;
        // float f1 = n1 + 1.1; // 编译失败
        double d1 = n1 + 1.1;   // 编译成功
        float f2 = n1 +1.1F;    // 编译成功
        // 当把一个具体的数赋值给byte时,先判断该数是否在byte范围(-128~127)内,如果是就赋值成功
        byte b1 = 10;   // 编译成功
        // byte b2 = 1000;  // 编译失败
        int n2 = 1;
        // 如果是变量赋值,先判断该数的类型
        // byte b3 = n2;    // 编译失败
        // byte、short和char不能相互自动转换
        // char c1 = b1;    // 编译失败
        // byte、short和char可以进行计算,计算时会先转换为int
        byte b4 = 1;
        short s1 = 1;
        // short s2 = b4 + s1;  // 编译错误
        int n3 = b4 + s1;   // 编译成功
        // byte b5 = b1 + b4;   // 编译失败
        byte n100 = 1;
        short n200 = 100;
        int n300 = 5;
        double n400 = 20;
        double n500 = n100 + n200 + n300 + n400;    // 结果是double类型,编译成功
        float n500 = n100 + n200 + n300 + n400;     // 结果是double类型,编译失败
        int n500 = n100 + n200 + n300 + n400;       // 结果是double类型,编译失败
    }
}

有多种类型的数据混合运算时,系统自动将所有数据类型转换成容量最大的数据类型,然后再进行计算。

byte、short和char之间不会相互自动转换,但是可以进行计算,计算会转换为int类型

boolean类型不参与转换

float转String不保留小数 java java中float转string_java

6个实心箭头,表示无信息丢失的转换;有 3 个虚箭头,表示可能有精度损失的转换。

  • 如果两个操作数中有一个是 double 类型, 另一个操作数就会转换为 double 类型。
  • 否则,如果其中一个操作数是 float 类型,另一个操作数将会转换为 float 类型。
  • 否则, 如果其中一个操作数是 long 类型, 另一个操作数将会转换为 long 类型。
  • 否则, 两个操作数都将被转换为 int 类型。

二、强制类型转换

取值范围大的类型 强制转换成 取值范围小的类型 。代码需要进行特殊的格式处理,不能自动完成。

  • 数据类型 变量名 = (数据类型)被转数据值;

强转符号只针对最近的操作数有效,可以使用小括号提升优先级

char类型可以保存int的常量值,但不能保存int类型的变量值,所以需要强转

byte、short和char之间进行计算会转换为int类型

public class ForceConvert {
	public static void main(String[] args) {

		// 强转只针对最近的操作数有效,这里只对10有效
		// int x = (int) 10 * 3.5 + 6 * 1.5;	// 编译失败

		// 可以使用小括号提高优先级
		int y = (int) (10 * 3.5 + 6 * 1.5);	// 编译成功
		System.out.println(y);

		// char类型可以保存int常量,但是不能保存int变量
		char c1 = 100;
		int n1 = 100;
		// char c2 = n1;	// 编译失败
		char c3 = (char) n1;	// 编译成功
		System.out.println(c3);
	}
}
  • int 强制转成 short 砍掉2个字节,可能造成数据丢失。
  • boolean类型不能发生数据类型转换。
  • 浮点转成整数,直接取消小数点,可能造成数据损失精度。

如果将一个数值强制转换为另一种类型, 而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。例如,(byte ) 300 的实际值为 44。

三、基本数据类型和String的转换

在程序开发中,需要经常将基本数据类型转换为String类型,或者将String类型转换为基本数据类型。

  • 基本数据类型转String类型:将基本数据类型的值 +"" 即可
  • String类型转基本数据类型:通过基本类型的包装类调用parseXXX方法

在将 String 类型转成基本数据类型时,要确保String类型能够转成有效的数据。比如,可以把"123",转成一个整数,但是不能把"hello"转成一个整数。如果格式不正确,就会抛出异常,程序就会终止。

public class StringToBasic {
	public static void main(String[] args) {
		
		// 基本数据类型转String
		int n1 = 100;
		float f1 = 1.1F;
		double d1 = 4.5;
		boolean b1 = true;
		String s1 = n1 + "";
		String s2 = f1 + "";
		String s3 = d1 + "";
		String s4 = b1 + "";
		System.out.println(s1 + " " + s2 + " " + s3 + " " + s4);

		// String类型转基本数据类型
		// 使用基本数据类型的包装类的相应方法得到基本数据类型
		String s5 = "123";
		int n2 = Integer.parseInt(s5);
		double d2 = Double.parseDouble(s5);
		float f2 = Float.parseFloat(s5);
		long l2 = Long.parseLong(s5);
		byte b2 = Byte.parseByte(s5);
		boolean b = Boolean.parseBoolean("true");
		short s = Short.parseShort(s5);

		System.out.println(n2 + " " + d2 + " " + f2 + " " + l2 + " " 
			+ b2 + " " + b + " " + s);

		// 将字符串转为char,通常是取字符串中的某一个字符
		System.out.println(s5.charAt(0));	// 代表取s5中的第一个字符

		String s6 = "hello";
		int num = Integer.parseInt(s6);	// 编译正确,运行异常
		System.out.println(num);

	}
}