基本类型的类型转换(难点)
自动类型转换主要指小范围向大范围转换,在编译阶段自动完成。
byte => short => int => long => float => double
char =>
boolean类型不参与任何形式的类型转换。
强制类型转换主要指大范围向小范围转换,需要编写代码进行处理。
尽量避免使用强制类型转换,因为该转换可能会造成数据的丢失。
格式:目标类型 变量名 = (目标类型)源类型的变量名;
当一个算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升(自动提升到与表达式中最高等级操作数同样的类型)
所有byte型,short型和char型将被提升到int型
整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。
1) short sValue = 5;
sValue = sValue -2; //error 因为与int型2做运算,所以表达式中的sValue将自动提升到int类型,
//则右边的表达式类型为int将一个int类型赋给short类型的变量将发生错误。
sValue = (short) (sValue - 2); //正确写法
2) float xx = 5.6; //error 因为5.6默认为double类型,必须使用强制类型转换才可以。
float xx = (float) 5.6;
3) System.out.println('a'+7+"Hello!"); // 104Hello! a=97 +7 =104
System.out.println("hello!"+'a'+7); // hello!a7
4) long类型转化为float类型时,会出现数据精度丢失
因为float类型的有效位数有限制,不可显示超过7位的有效位数(含小数点),达到8位时就会精度丢失,【double类型的精度为16位】
float yy = 5.123456789f; 结果:5.123457
float yy = 123456789f; 结果:1.23456792E8
5) short与int之间的类型转换问题
int a = 50; short b = a; //error:可能会损失精度
原因:50为常量,在编译阶段可以检查50是不是可以放在short中,若可以,则不报错。
a 为变量,a的值可能会发生改变,存在不确定因素。假设在代码中改为10^6,则放不下。
因此,java要避免这种错误发生,直接禁止这种类型之间的转换。
各类型转换方法(重点)
java为8中基本类型都提供了对应的包装类:
boolean对应Boolean、byte对应Byte、short对应Short、int对应Integer、long对应Long、char对应Character、float对应Float、double对应Double
8种包装类都提供了一个parseXxx(String str)静态方法用于将字符串转换成基本类型。
1. char/int、float、long、double ——> String 转换
1)String s = String.valueOf (intvar);
String s = String.valueOf (charvar);
2)String s = ""+intvar
3)String s =Integer.toString(intvar);
2. String->int、float、long、double 转换
1)int i = Integer.valueOf(my_str);
long l = Long.valueOf(s);
float f = Float.valueOf("1111");
double d = Double.valueOf("123");
char ch = Character.valueOf('1');
2)int i=Integer.parseInt(s);
float f= Integer.parseInt("12314");
long lo=long. parseInt(s);
double d=double.parseInt("12314");
3. String->char 转换
String s="abc";
Char a=s.charAt(0); //获取数组下标为0的进行返回