文档章节

7. Java基本数据类型转换

brucelee80
 brucelee80
发布于 2013/09/22 10:31
字数 1406
阅读 453
收藏 3
点赞 0
评论 0

转载自:http://my.oschina.net/brucelee80/blog

变量赋给变量

  1. boolean类型不可赋给其他基本数据类型

  2. 对于数值类型(包括字符型char),有以下规则:

  • 低取值范围赋给高取值范围则隐式转换(自动转换,因为能“装下”)

  • 高取值范围赋给低取值范围则显示转换(强制转换/手动转换,因为可能“装不下”)
        如果要强转的数超过低取值范围,则会被截断而导致数值发生不预期的变化。

  • 数值型取值范围由小到大如下:byte -> short -> int -> long -> float -> double

    int a1 = 1;
    long a2;
    
    // 将int型变量赋给long型变量,自动进行隐式转换
    a2 = a1; 
    // 将long型变量赋给int型变量,必须手动显示强转,否则编译失败
    // 至于是否会发生截断,主要看a2的值是否超过a1的取值范围
    // a2的值1L没有超过a1的int型取值范围,所以不截断,数值不变
    a1 = (int) a2;


  • 比较特殊的char,char虽然在最大数上比byte和short都大,但char是无符号的,假如将byte类型的-1赋给char,显然不合理,所以byte和char之间没有包含关系。

    所以byte <-> char以及short <-> char互相赋值时,都需要显示强转。

    byte b = -1;
    char c;
    
    c = (char) b ; // -1赋给char必须显示强转,但会溢出而导致数据变化
    System.out.println(c+0); // 打印65535而非-1
    
    b = (byte) c; // 必须显示强转
    System.out.println(b); // 打印-1而非65535

直接量赋给变量

  1. 字面量true、false只能赋给boolean,字符直接量只能赋给char,字符串直接量只能赋给String,null直接量只能赋给引用类型。

  2. 对于数值直接量,有以下规则:

  • 取值范围由小到大如下: int -> long –> float -> double

    long l = 12; // 隐式转换:int -> long
    float f1 = 12L; // 隐式转换:long -> float
    
    float f2 = (float) 3.14; // 必须显示强转:double -> float
    double d2 = 3.14f; // 隐式转换: float -> double

  • 注意,对于数值直接量,是没有byte,char,short类型直接量的,这三种类型赋值遵守的规则是:如果直接量超出它们的取值范围,则需要强转。

    byte b1 = 127; // 正确
    byte b2 = 128; // 错误,必须显示强转
    byte b3 = 1L; // 错误,必须显示强转
    byte b4 = 1d; // 错误,必须显示强转
    char c1 = 65535; // 正确
    char c2 = 65536; // 错误,必须显示强转

运算时的转换

  1. 算数运算时,所有低取值范围的数值,都将先隐式转换为算数式中取值范围最高的类型,然后再进行算数运算,这样的话,结果肯定也是取值范围最高的类型。

  2. 数值型取值范围由小到大如下: byte,char,short -> int –> long -> float -> double

    byte byte1 = 1;
    char char1 = 1;
    short short1 = 1;
    int int1 = 1;
    long long1 = 1;
    float float1 = 1;
    double double1 = 1;
    
    float f1 = int1 + float1; // 正确,结果为float型4.0(其实是两个float相加)
    int i1 =  int1 + float1; // 错误,不可把float赋给int
    
    double d1 = float1 + 1.0; // 正确,结果为double,因为直接量1.0是double型
    int i2 = 1 + 1.0; // 错误,结果为double型2.0,不能直接赋给int

  3. 比较特殊的是byte,char,short相互间不转换,它们都将先上升转换为int型再运算。

    short s = byte1 + short1; // 错误,结果为int型,int型不能直接赋给short
    int i3 = 1 + short1; // 正确,结果为int型

超出范围

  1. 超出某类型范围的直接量赋值给该类型时,将导致编译不通过

    byte b = 128; // 错误,超过byte最大值127,这个128是int型,不能赋给byte

  2. 超出类型范围的运算结果赋值给该类型时,编译不会出错,但会因截断而导致数据发生不预期的变化

    System.out.println(Integer.MAX_VALUE + 1); 
    // 结果-2147483648,因为它的结果是int且超出int的范围,故被截断
    System.out.println(Integer.MAX_VALUE + 1L); 
    // 结果2147483648,因为它的结果是Long且没有超出long的范围,故相加的结果正确

  3. 2147483648和9223372036854775808L是两个表达有问题的直接量
    根据第一点可以看出,比int最大值2147483647还大1的数2147483648,在Java中只能表达成2147483648L,否则无法使用这个直接量;
    同样比long最大值还大1的数不能通过基本数据类型来表示了,因为它超过了Java基本数据类型整数的取值范围。需要用到BigDecimal或BigInteger类来表达。

    int i = 2147483648; // 错误
    long l = 9223372036854775808L; // 错误

JDK5.0新特性——自动装箱和拆箱

/**
 * 基本数据类型可以直接赋给其包装类(自动装箱),
 * 相反,包装类也可以直接赋给基本数据类型(自动拆箱),
 * 在表达式中,基本数据类型和包装类可以进行运算
 * 基本数据类型的数组不能实现自动装箱和拆箱,即int[]不能当成Integer[]使用
 */
Boolean b = new Boolean(true); // 原本需要这么写
b = false; ; // 利用自动装箱特性,直接赋字面量

int i = 1;
i = new Integer(1); // 利用自动拆箱,将Integer对象赋给int型

Integer m = new Integer(2);
int n = 1 + m; // 运算,利用自动拆箱,将Integer对象赋给int型

// 只对该类型的直接量才可以自动装箱
int int1 = 1;
float f1 = int1; // 正确
float f2 = 1; // 正确
Float f3 = int1; // 错误,int型不能自动装箱成Float
Float f4 = 1; // 错误,字面量1不是float型不能自动装箱成Float

float f5 = new Integer(1); // 正确,将Integer自动拆箱成int再赋给float

转载自:http://my.oschina.net/brucelee80/blog

© 著作权归作者所有

共有 人打赏支持
brucelee80
粉丝 1
博文 18
码字总数 12525
作品 0
深圳
程序员
Java开发每日复盘2018_0514

今天主要跟大家分享3个部分: 一、「Java的核心机制」 二、「Java命名规范」 三、「Java数据类型相关」 下面我们来一个一个的说: 「Java核心机制」 Java是一种强制面向对象的解释型语言(O...

ZeroOSTalk ⋅ 05/14 ⋅ 0

Java小白进阶笔记(2)-变量和数据类型

1.Java有多少种数据类型,数据类型的分类? 两种数据类型: 基本数据类型 引用数据类型 除了八种基本数据类型,其他的都是引用数据类型。 2.Java的工作机制? Java程序的源代码(.java)编译...

阿里云云栖社区 ⋅ 05/25 ⋅ 0

Java编程语言:Java的类型转换与多态

对于Java语言应该都不陌生,今天我们就将Java中的入门部分概念做一具体的讲解一下。 1.什么叫JVM,JRE,JDK? JRE 全称为JavaRunningEnvironment,就是我们所说的java运行环境,由java虚拟机和一...

启示录是真的 ⋅ 05/22 ⋅ 0

Java常见的面试问题(带答案),自己答出来多少?

前言:觉得对自己有帮助别忘了也给其他小伙伴一起分享哦! 问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示”main方法不是public的”。 2.问题:Java里的传...

迷你芊宝宝 ⋅ 06/22 ⋅ 0

Scala笔记整理(二):Scala数据结构—数组、map与tuple

[TOC] 数组 定长数组 如果你需要一个长度不变的数组,可以用Scala中的Array。例如: 在JVM中,Scala的Array以Java数组方式实现。示例中的数组在JVM中的类型为java.lang.String[]。Int、Doubl...

xpleaf ⋅ 04/18 ⋅ 0

做几道基础的Java测试题,看看最近有进步吗?欢迎来学习

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

启示录是真的 ⋅ 05/24 ⋅ 0

java基础一(第一个java程序、数据类型、访问控制、static、)

一、第一个java程序 public class HelloWord {//public访问修饰符 class关键字,声明为类 HelloWord类名 //public访问修饰符 static关键字 void表示无返回值 main程序入口 } 二、数据类型 Ja...

废柴 ⋅ 02/11 ⋅ 0

Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/23 ⋅ 0

scala和java数据类型转换

在java和scala共同使用的时候,有时候涉及数据类型的相互转化,比如在使用scala json4s的时候很多地方不支持java数据类型。 java数据类型转换为scala数据类型 scala数据类型转化为java数据类...

张欢19933 ⋅ 04/27 ⋅ 0

Java面试2018常考题目汇总及答案带走不谢!

一、JAVA基础篇-概念 1.简述你所知道的Linux: Linux起源于1991年,1995年流行起来的免费操作系统,目前, Linux是主流的服务器操作系统, 广泛应用于互联网、云计算、智能手机(Android)等...

java高级架构牛人 ⋅ 06/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从方法论到零售客户实践 解码阿里巴巴数据中台——2018上海云栖大会

摘要: 一、数据中台之道 6月8日,上海云栖大会进入了第二天的议程,数据中台专场论坛座无虚席,数据中台总架构师邓中华女士向在场的观众介绍了数据中台的衍生发展之道。 基于OneID、OneData...

阿里云云栖社区 ⋅ 25分钟前 ⋅ 0

Ubuntu部署django问题汇总

使用Anaconda3的Python3.6的pip安装UWSGI报错 原因是gcc版本不兼容,安装4.7并修改gccsudo apt-get install gcc-4.7sudo mv /usr/bin/gcc /usr/bin/gcc.baksudo ln -s /usr/bin/gcc-4.......

wuyaSama ⋅ 28分钟前 ⋅ 0

从方法论到零售客户实践 解码阿里巴巴数据中台——2018上海云栖大会

摘要: 一、数据中台之道 6月8日,上海云栖大会进入了第二天的议程,数据中台专场论坛座无虚席,数据中台总架构师邓中华女士向在场的观众介绍了数据中台的衍生发展之道。 基于OneID、OneData...

猫耳m ⋅ 28分钟前 ⋅ 0

Docker减肥小记

如果经常使用 docker,你会发现 docker 占用的资源膨胀很快,其中最明显也最容易被察 如何快速的清理 docker 占用的系统资源,具体点说就是删除那些无用的镜像、容器、网络和数据卷… 1、查看...

寰宇01 ⋅ 39分钟前 ⋅ 0

微信小程序中如何使用WebSocket实现长连接(含完整源码)

本文由腾讯云技术团队原创,感谢作者的分享。 1、前言 微信小程序提供了一套在微信上运行小程序的解决方案,有比较完整的框架、组件以及 API,在这个平台上面的想象空间很大。腾讯云研究了一...

JackJiang- ⋅ 47分钟前 ⋅ 0

定制库到Maven本地资源库

1.如果只有定制库的JAR文件 下载链接如下:pdf.jar 2.使用命令转换成Maven本地资源 mvn install:install-file -Dfile=/Users/manager/Downloads/clj-pdf-2.2.33.jar -DgroupId=clj-pdf -Dar......

年少爱追梦 ⋅ 51分钟前 ⋅ 0

高仿springmvc之xuchen-mvc

package org.mvc.framework.servlet; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.......

徐志 ⋅ 53分钟前 ⋅ 0

关于自定义URLStreamHandler的一次踩坑

关于自定义URLStreamHandler的一次踩坑 20180625 lambo init 说明 一般自定义实现url的协议解析.方案为实现URLStreamHandler.实现其 openConnection 就可以了, 如果我们执行 new URL("xx://...

林小宝 ⋅ 54分钟前 ⋅ 0

【SM2证书】利用BC的X509v3CertificateBuilder组装X509国密证书

演示证书文件 链接: https://pan.baidu.com/s/1ijHNnMQJj7jzW-jXEVd6Gg 密码: vfva 所需jar包 <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on --> <dependenc......

小帅帅丶 ⋅ 55分钟前 ⋅ 0

用Calendar 实现 计算 一段时间的毫秒值

Calendar c=Calendar.getInstance();c.add(Calendar.MONTH, -1);int lastMonthMaxDay=c.getActualMaximum(Calendar.DAY_OF_MONTH);c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH)......

岸芷汀兰 ⋅ 59分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部