在Java程序中,不同的基本数据类型(只有7种,不包含boolean类型)变量的值经常需要进行相互转换。
转换的方式有两种:自动类型提升
和强制类型转换
。
自动类型提升
规则:将取值范围小(或容量小)的类型自动提升为取值范围大(或容量大)的类型 。
基本数据类型的转换规则如图所示:
1)当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围大的变量时
int i = 'A';//char自动升级为int,其实就是把字符的编码值赋值给i变量了
double d = 10;//int自动升级为double
long num = 1234567; //右边的整数常量值如果在int范围呢,编译和运行都可以通过,这里涉及到数据类型转换//byte bigB = 130;//错误,右边的整数常量值超过byte范围
long bigNum = 12345678912L;//右边的整数常量值如果超过int范围,必须加L,显式表示long类型。否则编译不通过
(2)当存储范围小的数据类型与存储范围大的数据类型变量一起混合运算时,会按照其中最大的类型运算。
int i = 1;
byte b = 1;
double d = 1.0;double sum = i + b + d;//混合运算,升级为double
(3)当byte,short,char数据类型的变量进行算术运算时,按照int类型处理。
byte b1 = 1;
byte b2 = 2;
byte b3 = b1 + b2;//编译报错,b1 + b2自动升级为intchar c1 = '0';
char c2 = 'A';
int i = c1 + c2;//至少需要使用int类型来接收
System.out.println(c1 + c2);//113
练习:
设 x 为float型变量,y为double型变量,a为int型变量,b为long型变量,c为char型变量,则表达式
x + y * a / x + b / y + c的值类型为:A. int B. long C. double D. char
强制类型转换
将3.14
赋值到int
类型变量会发生什么?产生编译失败,肯定无法赋值。
int i = 3.14; // 编译报错
想要赋值成功,只有通过强制类型转换
,将double
类型强制转换成int
类型才能赋值。
规则:将取值范围大(或容量大)的类型强制转换成取值范围小(或容量小)的类型。
自动类型提升是Java自动执行的,而强制类型转换是自动类型提升的逆运算,需要我们自己手动执行。
转换格式:
数据类型1 变量名 = (数据类型1)被强转数据值; //()中的数据类型必须<=变量值的数据类型
(1)当把存储范围大的值(常量值、变量的值、表达式计算的结果值)强制转换为存储范围小的变量时,可能会损失精度
或溢出
。
int i = (int)3.14;//损失精度 double d = 1.2; int num = (int)d;//损失精度 int i = 200; byte b = (byte)i;//溢出
(2)当某个值想要提升数据类型时,也可以使用强制类型转换。这种情况的强制类型转换是没有风险
的,通常省略。
int i = 1; int j = 2; double bigger = (double)(i/j);
(3)声明long类型变量时,可以出现省略后缀的情况。float则不同。
long l1 = 123L; long l2 = 123;//如何理解呢? 此时可以看做是int类型的123自动类型提升为long类型 //long l3 = 123123123123; //报错,因为123123123123超出了int的范围。 long l4 = 123123123123L; //float f1 = 12.3; //报错,因为12.3看做是double,不能自动转换为float类型 float f2 = 12.3F; float f3 = (float)12.3;
练习:判断是否能通过编译
1)short s = 5; s = s-2; //判断:no 2) byte b = 3; b = b + 4; //判断:no b = (byte)(b+4); //判断:yes 3)char c = ‘a’; int i = 5; float d = .314F; double result = c+i+d; //判断:yes 4) byte b = 5; short s = 3; short t = s + b; //判断:no
问答:为什么标识符的声明规则里要求不能数字开头?
//如果允许数字开头,则如下的声明编译就可以通过: int 123L = 12; //进而,如下的声明中l的值到底是123?还是变量123L对应的取值12呢? 出现歧义了。 long l = 123L;
基本数据类型与String的运算
字符串类型:String
String不是基本数据类型,属于引用数据类型
使用一对
""
来表示一个字符串,内部可以包含0个、1个或多个字符。声明方式与基本数据类型类似。例如:String str = “尚硅谷”;
运算规则
1、任意八种基本数据类型的数据与String类型只能进行连接“+”运算,且结果一定也是String类型
System.out.println("" + 1 + 2);//12 int num = 10; boolean b1 = true; String s1 = "abc"; String s2 = s1 + num + b1; System.out.println(s2);//abc10true //String s3 = num + b1 + s1;//编译不通过,因为int类型不能与boolean运算 String s4 = num + (b1 + s1);//编译通过
2、String类型不能通过强制类型()转换,转为其他的类型
String str = "123"; int num = (int)str;//错误的 int num = Integer.parseInt(str);//正确的,后面才能讲到,借助包装类的方法才能转
案例与练习
案例:公安局身份登记
要求填写自己的姓名、年龄、性别、体重、婚姻状况(已婚用true表示,单身用false表示)、联系方式等等。
/** * @author 尚硅谷-宋红康 * @create 12:34 */ public class Info { public static void main(String[] args) { String name = "康师傅"; int age = 37; char gender = '男'; double weight = 145.6; boolean isMarried = true; String phoneNumber = "13112341234"; System.out.println("姓名:" + name); System.out.println("年龄:" + age); System.out.println("性别:" + gender); System.out.println("体重:" + weight); System.out.println("婚否:" + isMarried); System.out.println("电话:" + phoneNumber); //或者 System.out.println("name = " + name + ",age = " + age + ",gender = " + gender + ",weight = " + weight + ",isMarried = " + isMarried + ",phoneNumber = " + phoneNumber); } }
练习:
练习1:
String str1 = 4; //判断对错: String str2 = 3.5f + ""; //判断str2对错: System.out.println(str2); //输出: System.out .println(3+4+"Hello!"); //输出: System.out.println("Hello!"+3+4); //输出: System.out.println('a'+1+"Hello!"); //输出: System.out.println("Hello"+'a'+1); //输出:
练习2:
System.out.println("* *"); //输出: System.out.println("*\t*"); //输出: System.out.println("*" + "\t" + "*"); //输出: System.out.println('*' + "\t" + "*"); //输出: System.out.println('*' + '\t' + "*"); //输出: System.out.println('*' + "\t" + '*'); //输出: System.out.println("*" + '\t' + '*'); //输出: System.out.println('*' + '\t' + '*'); //输出: