javaSE06-数据类型转换
1. 自动类型转换(AutoConvert)
当java程序在进行赋值或者运算时,精度小的类型会自动转换为精度大的数据类型,这个就是自动类型转换。数据类型按精度大小排序为:
char===>int===>long===>float===>double
byte===>short===>int===>long===>float===>double
个人理解:
小空间换进大空间可以自然进行,大空间换小空间需要舍去一部分,所以需要强制转化。由于整数精度没有小数大,所以小数在后面。
-
1.1 有多种类型的数据混合运算时,系统会先将所有数据自动转换为容量最大的数据类型,然后进行运算。
例:
public class AutoConvert{
public static void main(String[] args){
int i = 10;
float = i + 1.1;//运行错误, i+1.1===>结果类型为double (1.1为double类型)
//正确演示
float = i + 1.1f; // 结果为float类型 (1.1f 为float类型)
double = i + 1.1; // 结果为double类型(1.1为double类型)
}
}
- 1.2 当我们把精度(容量)大的类型赋值给精度(容量)小的类型时,会发生错误,反之则会自动转换。
public class AutoConvert{
public static void main(String[] args){
int i = 1.1;//错误,(1.1为double类型,大转小有精度损失)
}
}
- 1.3 byte,short与char类型之间不能自动转换。
- 1.4 当把具体的数值赋给byte时,系统会先判断所赋予的值是否在byte的范围内,如果在范围内,就可以赋值;如果赋予的值为变量,那么进行赋值会先判断变量的类型,如果变量的类型比byte大或者不相关(char),那么无法自动转换。
public class AutoConvert{
public static void main(String[] args){
int i = 1.1;//错误,(1.1为double类型,大转小有精度损失)
}
}
- 1.5 byte,short与char三者之间可以进行计算,计算时系统会首先将三者转换为int类型。
public class AutoConvert{
public static void main(String[] args){
byte b = 1;
short s1 = 1;
short s2 = s1 + b;// 错误,s1+b1计算结果为int类型,int类型无法自动转换为short类型;
int i = s1 + b;//正确,可以运行,结果为2;
}
}
- 1.6 Boolean类型不参与自动转换。
- 1.7 自动提升原则:表达式结果的类型会自动提升为表达式中元素最大的类型。
public class AutoConvert{
public static void main(String[] args){
byte b = 1;
short s1 = 1;
int i = 100;
float f = 100f;
float f1 = s1 + b + i + f;//运算结果类型为float,因为运算中元素类型最大为 f(float)型,因此结果自动提升为float类型;
}
}
2.强制类型转换(ForveConvert)
- 2.1 当数据类型转换为由大到小时,无法自动转换,这时就需要强制转换。强制转换需要使用强制转换符()完成。
- 2.2 强制转换时,会存在内存溢出以及精度损失的情况,使用时应格外注意!!!
- 2.3 内存溢出
public class ForceConvert{
public static void main(String[] args){
int i = 128;
byte b = (byte)i; //内存溢出,byte范围为-128~127;
//强制类型转换 (类型)变量名 高--低
//自动转换 低--高
System.out.println(i); // 128;
System.out.println(b); // -128,内存溢出;
}
}
- 2.4 精度损失
public class ForceConvert{
public static void main(String[] args){
//强制类型转换 (类型)变量名 高--低
//自动转换 低--高
int n1 = (int)1.9; //强制将double类型转换为int类型;
System.out.println(n1);//输出结果为1,造成了精度损失;
System.out.println((int)23.7); //23
System.out.println((int)-47.5F); //-45
}
}
- 2.5 强制转换只会对于最近的操作有效,往往会使用小括号(),来提升优先级。
public class ForceConvert{
public static void main(String[] args){
//强制类型转换 (类型)变量名 高--低
//自动转换 低--高
int x = (int)10*3.1+6*1.5; //运行错误,只将10转换为了int类型,运算结果仍为double类型,无法强制将double类型转换为int类型;
// 使用小括号提升优先级
int x = (int)(10*3.1+6*1.5); // 40,先优先计算结果(double类型),再把计算的结果转换为int类型;
}
}
- 2.6 char类型可以保存int的常量值,但无法保存int的变量值,需要强制转换。
public class ForceConvert{
public static void main(String[] args){
char c = 'a';
int d = c+1;
System.out.println(d); // 98 a对应的数据+1
System.out.println((char)d); // b a对应的数据+1 = 98 所对应的转义
//char类型可以保存int的常量值,但无法保存int的变量值。
char c1 = 100;
int n = 100;
char c2 = m;//运行错误,char类型无法保存int变量;
char c3 = (char)m;//强制转换后可以运行;
System.out.println(c3); // d 100所对应的转义;
}
}
- 2.7 byte,short与char三者之间可以进行计算,计算时系统会首先将三者转换为int类型。
3.总结
- 3.1 不能对布尔值进行转换。
- 3.2 不能把对象类型转化为不相干的类型。
- 3.3 大容量转换至低容量时,强制转换。
- 3.4 转换时可能存在内存溢出,或者精度问题。
- 3.5 操作比较大的数的时候,注意溢出问题。
- 3.6 jdk7 的新特性,数字之间可以用下划线分割。例:1000000 1000_000,下划线并不会被输出。
public class ForceConvert{
public static void main(String[] args){
//操作比较大的数的时候,注意溢出问题
//jdk7 的新特性,数字之间可以用下划线分割。例:1000000 1000_000,下划线并不会被输出。
int money = 10_0000_0000;
int years = 20;
int total = money*years; //-1474836480,计算时溢出
long total2 = money*years;//-1474836480,默认int,先计算,计算时已经溢出,转换后仍是已溢出状态的数据
long total3 = money*((long)years);//20000000000,现将数据转换为long,防止溢出,再计算
System.out.println(total3);//20000000000
}
}
4.基本数据类型与String类型的相互转换
- 4.1 基本数据类型转String类型语法: 将基本类型的值+" " 即可。
public class StringToBasic{
public static void main(String[] args){
//基本数据类型转String类型语法: 将基本类型的值+" "
int i = 100;
float f = 1.2f;
double d = 1.5;
boolean b = true;
String s1 = i + "";
String s2 = f + "";
String s3 = d + "";
String s4 = b + "";
System.out.println(s1);// 100
System.out.println(s2);// 1.2
System.out.println(s3);// 1.5
System.out.println(s4);// true
}
}
- 4.2 String类型转基本数据类型语法:通过基本类型的包装类调用parseXX方法即可。
public class StringToBasic{
public static void main(String[] args){
//String类型转基本数据类型语法:通过基本类型的包装类调用parseXX方法
String s1 = "153";
String s2 = "1.2";
String s3 = "1.5";
String s4 = "true";
int num1 = Integer.parseInt(s1);
float num2 = Float.parseFloat(s2);
double num3 = Double.parseDouble(s3);
Boolean num4 = Boolean.parseBoolean(s4);
System.out.println(s1);// 100
System.out.println(s2);// 1.2
System.out.println(s3);// 1.5
System.out.println(s4);// true
}
}
- 4.3 将String类型转换为基本数据类型时,要确保String类型能够转换为有效的数据,比如我们可以把"123"转换为一个整数,但却不能把"hello"转换为一个整数。
- 4.4 如果格式不正确,那么就会抛出异常,程序就会终止。