`
liuwei1981
  • 浏览: 770349 次
  • 性别: Icon_minigender_1
  • 来自: 太原
博客专栏
F8258633-f7e0-30b8-bd3a-a0836a5f4de5
Java编程Step-by...
浏览量:160789
社区版块
存档分类
最新评论

45.再说类型转换

 
阅读更多

在之前的内容中,我们已经知道了,数值简单数据类型数据之间是可以相互转换的。那么,在表达式中,它是如何转换的呢?比如,如果一个表达式中既有float类型的数据,又有double类型的数据,那么,得出来的结果到底是什么数据类型呢?


Java在编译期间就会进行扩展类型检查,并且在数据从一种类型转换到另一种类型时有严格的限制。


我们知道,在Java中,存在两种不同类型的类型转换:


隐式转换:在对包含非boolean简单数据类型(primitive type)的表达式求值的时候,Java会进行大量的隐式类型转换。

 

这些转换有很大的限制,但最基本的原则是这种转换必须是提升(widening,或称为扩大)而不是下降(narrowing,或称为缩小)转换。也就是说,隐式转换只能将一种简单数据类型转换到比它范围更大的类型。


强制类型转换:当隐式转换不能被我们所要求的表达式支持,或者是有特殊的需求,则需要进行强制的类型转换,这时候需要使用类型转换运算符进行强制转换。

 

对于单目(一元)运算符,例如++或--,隐式转换比较简单: byte、short、char类型的数被转换成int的,而其他类型的数据保持不变。


对于二元运算符,情况比较复杂,但是这种转换基本上遵循如下的基本方式:表达式中最长的类型为表达式的类型。下面是具体的运算规则:
1. 如果两个操作数中有一个是double类型的,则另一个也将会转换成double类型的,最后的运算结果也是double类型的,也就是说表达式的类型为double类型;否则
2. 如果两个操作数中有一个是float类型的,则另一个操作数也会转换成float类型的,此时表达式类型float类型;否则
3. 如果两个操作数中有一个是long类型的,另一个将会转换成long类型,此时,表达式的类型也为long类型,否则
4. 两个操作数都会转换成int类型。

 

对于byte/char/short类型的数据,在进行计算时都会转换成int类型来计算,得出的结果也是int类型。这点需要加以注意。

 

下面来看一个例子。

 

public class Implicit {
 public static void main(String[] agrs) {
  short s = 10;
  long l = 100;
  System.out.println(l * s);// 将会得到一个long类型的数值
  int a = 1;
  byte b = 2, e = 3;
  char c = 'a';
  int d = b + c;
  // byte f = b+e; //将会报错,因为计算得出的结果应该是int类型
  int i = 1234567809;
  float j = i;// 将会损失精度,得到的结果是1.23456781E9
  System.out.println(j);
  System.out.println(d);
 }
}


在这个例子中,如果将两个byte类型的数据相加,将结果赋给一个byte类型的变量,编译的时候将会出错,这是因为两个byte类型的值相加返回的是int类型的值。而如果将一个整型的值赋给一个float类型的变量,则会保留正确的数值级数,

 

但是,从例子中的结果可以看出,转换后已经损失了一些精度。


虽然不能将一个会产生int类型结果的表达式的值赋给byte类型变量,但是实际上,可以将整型值直接赋值给byte/short/char等“更窄”类型的变量,而不需要进行强制类型转换,只要不超出其表数范围即可。
例如:
byte b1 = 33;   //合法
byte b2 = 131   //非法,超出byte型数据表数范围
short s = 456;   //合法
char ch = 345;    //合法


隐式转换不但发生在表达式中,还发生在方法调用的时候。比如,当调用方法时的参数不是方法定义中所规定的参数类型的时候。


在上面已经讲过,Java可以自动“提升”数据类型,但是,经常的,我们需要将数据从较长的类型转换到较短的类型,如将double类型的数据转换成int 类型的数据,这个时候,Java 不会自动完成这个动作(默认情况下只会将int类型的数据转换成double类型的),所以,需要我们在程序中对其进行强制转换。当然,这种操作可能会引起信息的丢失。


在Java中,是通过运算符“()”来进行强制类型转换的。运算符“()”中应该有一个将要转换成的目标数据类型。


来看下面这个例子:
public class Explicit {
 public static void main(String[] args) {
  double x = 9.987;
  int i = (int) x;
  System.out.println(i);
 }
}


运行这个程序,将在控制台上打印初一个数字9。可以看出,在进行强制转换的时候只是简单的将小数截去了,而只保留了整数部分。


由于在将数值进行“缩小”强制类型转换时会导致数据的信息丢失,所以应该尽量小心使用。


除了简单数据类型外,类型转换还可以引用于引用类型的数据。任何对象都可以被转换成它的基类或任何它所实现的接口。一个接口也可以被转换成它所扩展的任何其他接口。关于这部分的内容,请看后续的章节。

 

 

 

分享到:
评论

相关推荐

    Java再说JNI之实例

    - **数据类型转换**:Java和C/C++的数据类型不完全相同,需要正确转换。 本文提供的两个rar文件,`jniWin32.rar`和`jni.rar`,可能包含了与Windows平台相关的JNI示例代码,帮助读者更具体地了解JNI在实际操作中的...

    Linux操作系统基础教程

    文件类型...........................................................................................................................7 三.Linux基本操作命令................................................

    springmybatis

    其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细...

    superprogram3.0文件加密

    软件说明:这是一款文件夹加密软件,加密之后仍以文件夹形式保存,不需要压缩或者转换成文件的形式,所以加密速度超快! 加密之后的文件夹不仅不能访问,而且不能复制、删除、重命名...总之除了格式化之外其他的任何...

    灵活小巧加密解密工具

    软件说明:这是一款文件夹加密软件,加密之后仍以文件夹形式保存,不需要压缩或者转换成文件的形式,所以加密速度超快! 加密之后的文件夹不仅不能访问,而且不能复制、删除、重命名...总之除了格式化之外其他的任何...

    组件化开发之如何封装组件.rar

    3. **数据处理组件**:处理数据的获取、存储和格式转换,如网络请求库、数据库操作等。 4. **工具类组件**:提供通用功能,如日志记录、时间格式化等。 五、组件化开发框架 1. **React Native**:Facebook推出的跨...

    华为编程开发规范与案例

    所以结构指针传入函数后,如要进行指针移动操作,最好先将其转化为_UC型再说。总之指针操作要小心为上。 3、避免指针的非法引用 【案例1.3.1】 【正 文】 在一次测试中,并没有记得做了什么操作,发现HONET系统的...

    matlab代码转java-Tiny-Things-Archive:零碎文件的存档

    期末之后再说吧。在此提醒一下自己。 4. Message Digest, format to uint8 in MATLAB and save .mat file in Python3 获取信息摘要,转换为 MATLAB 中的 uint8 数据类型,并保存为 .mat 文件。MATLAB 算信息摘要跟要...

    计算机编程语言介绍大全.docx

    再说这个至高境界,武功练到至高境界,据说飞花摘叶也能伤人,但古往今来,有几个人能练到至高境界,还是普通人最多,因此,你还是选择适合自己的语言进行学习,而不要想把某个语言练到至高境界后做什么都行。...

    C#判断一个字符串是否是数字或者含有某个数字的方法

    这通常涉及到字符串的操作和数据类型的转换。本文将详细介绍几种常用的方法,并提供代码示例,以便大家理解和参考。 ### 1. 使用异常处理(Try..Catch)进行判断 这种方法通过尝试将字符串转换为数字,并捕捉在...

    C++编制股票DLL公式

    // 数据类型转换 __declspec(dllexport) int WINAPI ZIG(CALCINFO* pData) { float c2[pData->m_nNumData],c3[pData->m_nNumData]; if ( pData->m_pfParam1 && //参数1有效 pData->m_nParam1Start参数1为常数 ...

    生产制造追溯系统之再说条码打印

    我们以生产线卡通包装工位为例,描述了如何通过系统自动将扫描完成的彩盒条码转换为对应的卡通标贴,并直接打印出来。在这个过程中,操作员需要扫描多个彩盒条码,并在扫描完成后结束装箱,此时系统会将相应的卡通...

    由入门到精通_吃透_PID.pdf

    - **1-12 怎样投自动**:讲解如何将手动控制系统转换为自动控制系统的方法和步骤。 - **1-13 观察哪些曲线**:指导如何通过分析控制系统的输出曲线来评估其性能。 #### 二、吃透PID - **2-1 几个基本概念**:明确...

    ERStudio8.0安装包

    该工具能够将ER模型直接转换为SQL脚本,使得数据库的创建和更新过程更为高效。在标题"ERStudio8.0安装包"中,我们了解到这是ERStudio的第8.0版本的安装程序,适用于需要进行数据库设计的用户。 ER图,全称为实体...

    最全PID资料

    - **1-10 调节器**:概述了不同类型调节器的特点及适用场景,强调了调节器在工业自动化中的核心地位。 - **1-11 再说PID**:针对PID控制的常见问题进行了答疑,帮助读者更好地理解并应用PID控制。 - **1-12 怎样投...

Global site tag (gtag.js) - Google Analytics