Java变量、数据类型和运算符 2

简介: Java变量、数据类型和运算符

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);   /*显示第二次考试平均分*/

   }

}


566de45d389b407d8a2f9f608c2b9070.png

程序运行结果如图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);      //输出比较结果

   }

}


a7e43c02d8e6473caec54c4d7f9c45b8.png

程序运行结果如图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)运算符的优先级:算术运算符>关系运算符>逻辑运算符,即在一个表达式中,算术运算符的优先级最高,关系运算符次之,然后是逻辑运算符。逻辑运算符将在下一章进行学习。如果在一个表达式中包含赋值运算符,则它的优先级最低。当运算符比较多时,可以使用小括号改变某个运算符的执行顺序

目录
相关文章
|
1月前
|
存储 缓存 安全
除了变量,final还能修饰哪些Java元素
在Java中,final关键字不仅可以修饰变量,还可以用于修饰类、方法和参数。修饰类时,该类不能被继承;修饰方法时,方法不能被重写;修饰参数时,参数在方法体内不能被修改。
28 2
|
5天前
|
存储 缓存 安全
Java中的数据类型
Java语言提供了八种基本类型,分为4类8种:六个数值型(四个整数型byte、short、int、long,两个浮点型float、double)、一个字符型char和一个布尔型boolean。每种基本类型有固定的位数、取值范围及默认值。此外,还存在`void`类型,但无法直接操作。基本类型支持隐式和显式类型转换,并有对应的包装类如`Integer`、`Double`等,用于在需要对象的场景中使用。包装类支持自动装箱与拆箱机制,简化了基本类型与引用类型的转换,但需要注意性能和空指针异常等问题。
Java中的数据类型
|
2月前
|
Java 编译器
java“变量 x 可能未被初始化”解决
在Java中,如果编译器检测到变量可能在使用前未被初始化,会报“变量 x 可能未被初始化”的错误。解决方法包括:1. 在声明变量时直接初始化;2. 确保所有可能的执行路径都能对变量进行初始化。
276 2
|
1月前
|
Java 编译器
Java重复定义变量详解
这段对话讨论了Java中变量作用域和重复定义的问题。学生提问为何不能重复定义变量导致编译错误,老师通过多个示例解释了编译器如何区分不同作用域内的变量,包括局部变量、成员变量和静态变量,并说明了使用`this`关键字和类名来区分变量的方法。最终,学生理解了编译器在逻辑层面检查变量定义的问题。
Java重复定义变量详解
|
1月前
|
Java
Java基础之数据类型
Java基础之数据类型
20 6
|
1月前
|
Java
在Java中如何将基本数据类型转换为String
在Java中,可使用多种方法将基本数据类型(如int、char等)转换为String:1. 使用String.valueOf()方法;2. 利用+运算符与空字符串连接;3. 对于数字类型,也可使用Integer.toString()等特定类型的方法。这些方法简单高效,适用于不同场景。
57 7
|
1月前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
61 4
|
1月前
|
存储 消息中间件 NoSQL
使用Java操作Redis数据类型的详解指南
通过使用Jedis库,可以在Java中方便地操作Redis的各种数据类型。本文详细介绍了字符串、哈希、列表、集合和有序集合的基本操作及其对应的Java实现。这些示例展示了如何使用Java与Redis进行交互,为开发高效的Redis客户端应用程序提供了基础。希望本文的指南能帮助您更好地理解和使用Redis,提升应用程序的性能和可靠性。
41 1
|
2月前
|
算法 Java 测试技术
🌟Java 零基础 | 详解 单目运算符
【10月更文挑战第14天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
54 7