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

目录
相关文章
|
24天前
|
Java 编译器
java“变量 x 可能未被初始化”解决
在Java中,如果编译器检测到变量可能在使用前未被初始化,会报“变量 x 可能未被初始化”的错误。解决方法包括:1. 在声明变量时直接初始化;2. 确保所有可能的执行路径都能对变量进行初始化。
|
2月前
|
Java
Java运算符
Java运算符
48 12
|
2月前
|
Java
java基础(8)数据类型的分类
Java数据类型分为基本数据类型(8种)和引用数据类型。基本类型包括byte, short, int, long, float, double, boolean, char。每种类型有固定占用空间大小,如int占用4字节。字符编码如ASCII和Unicode用于将文字转换为计算机可识别的二进制形式。
64 2
|
3天前
|
Java 编译器
Java重复定义变量详解
这段对话讨论了Java中变量作用域和重复定义的问题。学生提问为何不能重复定义变量导致编译错误,老师通过多个示例解释了编译器如何区分不同作用域内的变量,包括局部变量、成员变量和静态变量,并说明了使用`this`关键字和类名来区分变量的方法。最终,学生理解了编译器在逻辑层面检查变量定义的问题。
Java重复定义变量详解
|
12天前
|
算法 Java 测试技术
🌟Java 零基础 | 详解 单目运算符
【10月更文挑战第14天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
26 7
|
11天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
13天前
|
Java 测试技术 开发者
🌟Java 零基础 | 深入理解三目运算符
【10月更文挑战第13天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
12 3
|
11天前
|
存储 Java 关系型数据库
[Java]“不同族”基本数据类型间只能“强转”吗?
本文探讨了不同位二进制表示范围的计算方法,重点分析了Java中int和char类型之间的转换规则,以及float与int类型之间的转换特性。通过具体示例说明了显式和隐式转换的条件和限制。
28 0
[Java]“不同族”基本数据类型间只能“强转”吗?
|
14天前
|
Java 测试技术 开发者
🌟Java零基础-Lambda运算符详解 🌟
【10月更文挑战第12天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
18 1
|
2月前
|
存储 Java Windows
java基础(9)数据类型中的char类型以及涉及到的转义字符
Java中的char类型可以存储一个中文字符,因为它占用两个字节。转义字符允许在代码中使用特殊字符,例如`\n`表示换行,`\t`表示制表符,`\\`表示反斜杠,`\'`表示单引号,`\"`表示双引号。可以使用`\u`后跟Unicode编码来表示特定的字符。
47 2
java基础(9)数据类型中的char类型以及涉及到的转义字符