更详细的说明,请参考: Java 原生类型与包装器类型深度剖析,https://blog.csdn.net/justloveyou_/article/details/52651211

一. 原生类型与包装器类型

1Byte = 8 Bits

二. 自动转型与强制转型

精度(低1-高5)    
1 byte(1字节) Byte
short(2字节) Short
char(2字节) Character
     
2 int(4字节) Integer
     
3 long(8字节) Long
     
4 float(4字节) Float
     
5 double(8字节) Double
     
NA boolean(未定) Boolean

1、 自动转型

自动转型总原则:byte,short,char(同级)-> int -> long -> float -> double (由低精度到高精度)

1.1 由低精度到高精度的自动转换

具体可分为以下两种情形:

1)从位数低的类型向位数高的类型转换

byte b = 1;
char c = 1;
short s = 1;
int i = 1; c = b; // Error,同级
c = s; // Error,同级
s = c; // Error,同级
i = c; // OK

2) 从整型向浮点型的转换

int i = 1;
long t = 1;
float f = 1;
double d = 1; f = i; // Ok
f = t; // Ok
d = f; // Ok

1.2 运算符对基本类型的影响

具体可分为以下两种情形:

1) 当使用 +、-、*、/、%、==、>、< 等 等运算符对基本类型进行运算时,遵循如下规则:

  两个操作数中,先考虑是否有一个是double类型的。如果有,另一个操作数和结果 将会被转换成double类型。再依次考虑float,long。除此之外,两个操作数(包括byte、short、int、char)都将会被转换成int类型。

byte b1 = 10 ;  //OK,会检查发现10没有超过byte类型的最大值
byte b2 = 12; //OK,会检查发现12没有超过byte类型的最大值 byte b = b1 + b2; //Error,byte类型在计算时会自动提升为int类型,此时就会报错,因为b1+b2实际上是int类型,但是左侧的变量为byte类型。 short s1=1; //OK,会检查发现1没有超过short类型的最大值
s1=s1+1; //Error,因为s1+1 结果int,但左侧变量为 short,报错 s1++; //OK,不会报错,与s1=s1+1不同!!!,会检查发现2没有超过short类型的最大值 s1=1+1; //OK,1+1 是个编译时可以确定的常量,'+'运算在编译时就被执行了,而不是在程序执行的时候,这个语句的效果等同于s1=2

2) 当使用 +=、-=、*=、/=、%= 、 i++、 ++i 运算符对基本类型进行运算时,遵循如下规则:

  运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,且运算结果与运算符左边数值类型相同。自增(减)运算也类似。

short s1=1; // OK,会检查发现1没有超过short类型的最大值
short s2; s1+=1; // OK,正确,1首先被强制转换为short型,然后再参与运算,并且结果也是short类型 s2 = ++s1; // OK,正确,s2的值为2

2、强制转型

强制转换的格式是在需要转型的数据前加上 “( )”, 然后在括号内加入需要转化的数据类型。主要发生于以下两种情形:

  • 由高精度向低精度转换

  • 一种类型到另一种类型转换,则必须使用强制类型转化(同级之间:byte,short,char)

 byte b = 3;
int i = 3;
long t = 3;
float f = 3;
char c = 3;
short s = 3; i = (int) f; // OK,由高精度向低精度转换
t = (long) f; // OK,由高精度向低精度转换
b = (byte) i; // OK,由高精度向低精度转换 i = b; // OK,由低精度向高精度转换,自动转型
System.out.println(c==s); // OK,true,c 和 s 自动转型为int,然后比较 b = (byte) s; // OK,一种类型到另一种类型转换
c = (char) b; // OK,一种类型到另一种类型转换
c = (char) s; // OK,一种类型到另一种类型转换

特别需要注意的是,强制转换常常会导致二进制位的截取,甚至会导致意想不到的结果:

int i = 128;
byte b = (byte)i;
System.out.println(b); // -128(即-0)

---------------------
作者:书呆子Rico
来源:CSDN
原文:https://blog.csdn.net/justloveyou_/article/details/52651211
版权声明:本文为博主原创文章,转载请附上博文链接!

Java 基础 - 原生类型的更多相关文章

  1. java 基础 浮点类型

    1.浮点类型用于表示小数的数据类型. 2.浮点数原理:也就是二进制科学计数法. 3.Java的浮点类型有float和double两种. 4.Java默认浮点类型计算的结果是double类型,字面量也是 ...

  2. java 基础 字符类型

    1.char类型的字面量可以是一个英文字母.字符或一个汉字,并且由单引号包括. 2.Java底层使用一个16位的整数来处理字符类型,该数值是一个字符的unicode编码值. unicode: 1.un ...

  3. java 基础 整数类型

    1.Java有四种整数类型:byte.short.int和long. 2.Java默认整数计算的结果是int类型. 3.整数的字面量是int类型. 4.若字面量超过int类型的最大值,则字面量是lon ...

  4. Java基础__Integer类型中的自动装箱

    Integer类型的自动装箱:就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱. ...

  5. Java 基础 - 基本类型 & 包装类型

    基本数据类型和包装类的区别 定义不同.包装类属于对象,基本数据类型不是 声明和使用方式不同.包装类使用new初始化,有些集合类的定义不能使用基本数据类型,例如 ArrayList<Integer ...

  6. Java基础——基本类型包装类

    一.概述: 将基本数据类型封装成对象 优点: 可以在对象中定义更多的功能方法操作该数据 常见用法: 用于基本类型与字符串之间的转换 基本数据类型 包装类 byte Byte short Short i ...

  7. Java基础类型总结

    最近一直在总结反思自己, 趁着现在请假在学校上课的空余时间,从基础开始重新温故学习下Java,充实下自己. 一.数据类型 从下图中,我们可以很清晰的看出Java中的类型,其中红色方框中的是Java的4 ...

  8. Java 基础【09】 日期类型

    java api中日期类型的继承关系 java.lang.Object --java.util.Date --java.sql.Date --java.sql.Time --java.sql.Time ...

  9. 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错

    原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...

随机推荐

  1. kubeadm生成的token重新获取

    当你的token忘了或者过期,解决办法如下: 1.先获取token #如果过期可先执行此命令kubeadm token create #重新生成token#列出tokenkubeadm token l ...

  2. Dubbo执行流程?

    Dubbo执行流程? 0 start: 启动Spring容器时,自动启动Dubbo的Provider 1.register: Dubbo的Provider在启动后自动会去注册中心注册内容.注册的内容包 ...

  3. html input 上capture 参数在 安卓 苹果上的异同

    安卓上 <input type="file" accept="image/*" capture="camera"> //只调用相 ...

  4. Linux统计根分区使用率

    #!/bin/bash # 统计根分区使用率 # 作者: shaohsiung # 时间: // rate=$(df -h | grep "dev/sda3" | awk '{pr ...

  5. python从字符串中提取数字_filter

    my_str = '123and456' number = filter(str.isdigit, my_str ) # number = 123456 使用正则表达式: >>> i ...

  6. js的三种消息框alert,confirm,prompt

    原文:http://blog.csdn.net/lixiang0522/article/details/7764730 <html> <head> <script typ ...

  7. unity 打包Apk生成签名证书keystore

    进行Android项目开发中想要将androidapp导出为apk的时候需要选择一个数字证书,即keystore文件(android.keystore),它用来对我们的APP进行签名,是导出APP的一 ...

  8. Java——super关键字

    2.3 super关键字 ①super不是引用类型,super中存储的不是内存地址,super指向的不是父类对象. ②super代表的是当前子类对象中的父类型特征. ③什么时候使用super? 类和父 ...

  9. php上传(三)

    关于一些上传插件的运用 JQuery上传插件Uploadify使用详解 http://www.cnblogs.com/oec2003/archive/2010/01/06/1640027.html

  10. vue中利用scss实现整体换肤和字体大小设置

    一.前言 利用Sass预处理实现换肤和字体大小调整. 思路及达到的效果:字体大小的适配使用window.devicePixelRatio的值和需要调整的差量进行控制.页面初始化是的字体适配可以根据de ...