2.3 数据类型转换
1.为什么需要数据类型转换
实际中可能会遇到下面的问题。
问题:某班第一次考试平均分是81.29,第二次比第一次增加了 2分,第二次的平均分是多少?
分析:有时会遇到这样的情况:必须将一个int数据类型的变量与一个double数据类型的变量相加。那么,不同的数据类型能进行运算吗?运算的结果又是什么数据类型呢?
下面就分别回答这些问题。
2.如何进行数据类型转换
1)自动数据类型转换
要解决不同类型之间的数据计算问题,就必须进行数据类型转换。示例4用来解决刚才的问题。
示例4
代码:
package cn.dbit.demo;
public class AutoTypeChange {
public static void main(String[] args) {
double fisrtAvg = 81.29;
double secondAvg;
int rise = 2;
secondAvg = fisrtAvg + rise;
System.out.println("第二次平均分是:" + secondAvg);
}
}
解析:
package cn.dbit.demo;
public class AutoTypeChange {
public static void main(String[] args) {
double fisrtAvg = 81.29; //第一次考试的平均分
double secondAvg; //第二次考试的平均分
int rise = 2; //增长的分数
secondAvg = fisrtAvg + rise; //自动类型转换
System.out.println("第二次平均分是:" + secondAvg); /*显示第二次考试平均分*/
}
}
程序运行结果如图2.6所示。
图2.6示例4的运行结果
从代码中可以看出,double型变量firstAvg和int型变量rise相加后,计算的结果赋给一个double型变量secondAvg.这时就发生了自动类型转换。
规则1 :如果一个操作数为double类型,则整个表达式可提升为double 类型。
首先,Java具有应用于一个表达式的提升规则,表达式(firstAvg + rise)中操作数firstAvg是double类型,则整个表达式的结果为double类型。这时,int类型变量「ise隐式地自动转换成double类型,然后它和double类型变量firstAvg相加,最后结果为double类型并赋给变量secondAvg。那么为什么int类型变量可以自动转换成double类型变量呢?这也是因为Java语言的一些规则造成的。将一种类型的变量赋给另一种类型的变量时,就会发生自动类型转换。
例如:
int socre = 80;
double newScore = score;
这里,int类型变量score隐式地自动转换为double类型变量。但是,这种转换并不是永远无条件发生的。
规则2:满足自动类型转换的条件。
两种类型要兼容:数值类型(整型和浮点型)互相兼容。
目标类型大于源类型:double类型可以存放int类型数据,因为为double类型变量分配的空间宽度足够存储int类型变量。因此,我们也把int类型变量转换成double类型变量称为 "放大转换"。
2)强制数据类型转换
事实上,自动类型转换并非所有情况下都有效。如果不满足上述条件,当必须将double类型变量的值赋给一个int类型变量时,该如何进行转换呢?这时系统就不会完成自动类型转换了。
问题:去年Apple笔记本所占的市场份额是20%,今年增长的市场份额是9.8%,求今年所占的份额?
分析:不难发现计算的方法并不难,原有市场份额加上增长的市场份额便是现在所占的市场份额。因此,可以声明一个int类型变量before来存储去年的市场份额,一个double类型变量rise来存储增长的部分。但是如果直接将这两个变量的值相加,然后将计算结果直接赋给一个int类型变量now会提示出现问题吗?尝试后会发现IDEA会提示 “类型不匹配” 的错误信息。
示例5
代码:
package cn.dbit.demo;
public class TypeChange {
public static void main(String[] args) {
int before = 20;
double rise = 9.8;
int now = before + (int)rise;
System.out.println("新的市场份额是:" + now);
}
}
分析:
package cn.dbit.demo;
public class TypeChange {
public static void main(String[] args) {
int before = 20; //Apple 笔记本市场份额
double rise = 9.8; //增长的份额
//计算新的市场份额 (double 类型变量强制转化成 int 类型变量)
int now = before + (int)rise; //现在的份额
System.out.println("新的市场份额是:" + now);
}
}
示例5给出了解决方案,示例5的运行结果如下。
新的市场份额是: 29
根据类型提升规则,表达式(before + rise)的值应该是double类型,但是最后的结果却要转变成int类型,赋给int类型变量now。由于不能进行放大转换,因此必须进行显式地强制类型转换。
语法:
(数据类型)表达式
在变量前加上括号,括号中的类型就是要强制转换成的类型。例如:
double d = 34.5634;
int b = (int)d;
运行后b的值如下:
34
从示例中可以看出.,由于强制类型转换往往是从宽度大的类型转换成宽度小的类型,使数值损失了精度(如2.3变成了 2,34.5634变成了 34),因此可以形象地称这种转换为 "缩小转换"。
小结:数据类型转换的形式分为自动数据类型转换和强制数据类型转换两种。
2.4 boolean 类型
前面已经学习了一些数据类型,有表示数字的,有表示字符的,……。但是事物往往还有真假之分,如在判断一件艺术品的时候常说:"这是真的" 或 "这是假的"。另外,也会经常做一些这样的判断,如 "地铁2号线的首发车时间是5:00吗?"、"这次考试成绩在90分之上吗?"、"健身俱乐部的年费低于1000元吗?"等,这些问题都需要经过判断。但答案只能有两个,要么"是"(即真)要么"否"(即假)。程序也一样,有时也需要判断真假。这时就需要一种数据类型,专门用来表示真和假。Java中使用boolean类型表示真假。"boolean" 又称 "布尔",所以我们常说 "布尔类型"。boolean是Java的关键字,所有字母为小写。
表示真假可以用boolean类型,那么怎么表示呢?其实boolean类型有两个值,而且只有这两个值。boolean类型的值如下表所示。
2.5 关系运算符
现在知道了程序用boolean数据类型表示真和假,但是程序如何知道真假呢?程序可以通过比较大小、长短、多少等得知其真假。Java提供了一种可以比较大小、长短、多少等的运算符,这就是关系运算符。下表列出了 Java语言中提供的关系运算符。
从上表可以看出,关系运算符是用来做比较运算的,而比较的结果是一个boolean类型的值,要么是真(true),要么是假 (false)。
问题:从控制台输入张三同学的成绩,与李四的成绩( 80分)进行比较,然后输出“张三成绩比李四的成绩高吗? ”这句话的判断结果。
分析:程序要实现的功能可以分为以下两部分。
(1) 实现从键盘获取数据。
(2) 比较数据,并输出比较结果。
示例6
代码:
package cn.dbit.demo;
import java.util.Scanner;
public class BoolTest {
public static void main(String[] args) {
int liSi = 80;
boolean isBig;
Scanner input = new Scanner(System.in);
System.out.print("输入学员张三成绩:");
int zhangSan = input.nextInt();
isBig = zhangSan > liSi;
System.out.println("张三成绩比李四高吗?" + isBig);
}
}
分析:
package cn.dbit.demo;
import java.util.Scanner;
public class BoolTest {
public static void main(String[] args) {
int liSi = 80; //学员李四的成绩
boolean isBig; //声明一个 boolean 类型的变量
Scanner input = new Scanner(System.in); //Java 输入的一种方法
System.out.print("输入学员张三成绩:"); //提示要输入学员张三的成绩
int zhangSan = input.nextInt(); //输入张三的成绩
isBig = zhangSan > liSi; //将比较结果保存在 boolean 变量中
System.out.println("张三成绩比李四高吗?" + isBig); //输出比较结果
}
}
程序运行结果如图2.7所示。
图2.7示例6的运行结果
由示例6可见,和所有其他数据类型一样,在使用boolean类型之前,也需要先进行声明和赋值,如下所示。
boolean isBig;
isBig = zhangSan > liSi;
比较结果是一个boolean类型的值,结果为"假",因此示例6的输出结果为false。
注意:”=” 和 “==” 的区别。
(1) “=” 是赋值运算符,即把右边的值赋给 “=” 左边的变量,如int num = 20。
(2) “==” 是比较运算符,即 “左边的值与 “==” 右边的值比较,看它们是否相等,如果相等则为true, 否则为false,如3==4的结果为false。
小结:
(1)到现在为止,已经学过的数据类型和运算符有哪些?自己在纸上写一下,记不起来时可以翻看前面的内容,这些数据类型和运算符在后面的学习中会经常用到。
(2)运算符的优先级:算术运算符>关系运算符>逻辑运算符,即在一个表达式中,算术运算符的优先级最高,关系运算符次之,然后是逻辑运算符。逻辑运算符将在下一章进行学习。如果在一个表达式中包含赋值运算符,则它的优先级最低。当运算符比较多时,可以使用小括号改变某个运算符的执行顺序