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.2.4 boolean 类型
前面已经学习了一些数据类型,有表示数字的,有表示字符的,……。但是事物往往还有真假之分,如在判断一件艺术品的时候常说:"这是真的" 或 "这是假的"。另外,也会经常做一些这样的判断,如 "地铁2号线的首发车时间是5:00吗?"、"这次考试成绩在90分之上吗?"、"健身俱乐部的年费低于1000元吗?"等,这些问题都需要经过判断。但答案只能有两个,要么"是"(即真)要么"否"(即假)。程序也一样,有时也需要判断真假。这时就需要一种数据类型,专门用来表示真和假。Java中使用boolean类型表示真假。"boolean" 又称 "布尔",所以我们常说 "布尔类型"。boolean是Java的关键字,所有字母为小写。
表示真假可以用boolean类型,那么怎么表示呢?其实boolean类型有两个值,而且只有这两个值。boolean类型的值如表2-5所示。
表2-5 boolean类型的值
2.2.5 关系运算符
现在知道了程序用boolean数据类型表示真和假,但是程序如何知道真假呢?程序可以通过比较大小、长短、多少等得知其真假。Java提供了一种可以比较大小、长短、多少等的运算符,这就是关系运算符。表2-6列出了 Java语言中提供的关系运算符。
表 2-6 关系运算符
从表2-6可以看出,关系运算符是用来做比较运算的,而比较的结果是一个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)运算符的优先级:算术运算符>关系运算符>逻辑运算符,即在一个表达式中,算术运算符的优先级最高,关系运算符次之,然后是逻辑运算符。逻辑运算符将在下一章进行学习。如果在一个表达式中包含赋值运算符,则它的优先级最低。当运算符比较多时,可以使用小括号改变某个运算符的执行顺序。
2.3 技能训练
上机练习1
指导——升级“我行我素购物管理系统”,实现购物结算功能
训练要点
运算符(*、=)的使用。
从控制台输出信息。
需求说明
张三的购物清单如表2-7所示。