更详细的说明,请参考: 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. 访问nginx时验证密码

    只允许1.2.3.4这个IP访问我们的站点,拒绝所有其他IP的访问. server { listen 80; server_name www.example.com; satisfy any; all ...

  2. python代码技巧总结(更新至17条)

    怎么提高代码水平?答:看牛逼的代码! 牛逼的代码怎么写的?简单,明确,优雅! 怎么简单,明确,优雅?学技巧! 下面搜罗了一些有才格子褂青年的总结,哈哈 1.检查 Python 中的对象 调用 dir( ...

  3. 将Java和Javac的命令在控制台的输出重定向到txt文件

    当我们在Windows控制台窗口执行程序时,输入如下命令: demo.exe > out.txt 就可以把demo程序的输出重定向到out.txt文件里面. 但是这种方法对于java和javac ...

  4. TRUNCATE - 清空一个表

    SYNOPSIS TRUNCATE [ TABLE ] name DESCRIPTION 描述 TRUNCATE 快速地从一个表中删除所有行.它和无条件的 DELETE 有同样的效果,不过因为它不做表 ...

  5. 随笔记录 shell脚本相关内容 2019-8-26

    字符串截取: 假设变量为var=http://www.hao.com/123.htm1. # 号截取,删除左边字符,保留右边字符.echo ${var#*//}其中 var 是变量名,# 号是运算符, ...

  6. QT开发资料

    QT开发入门资料 https://tmr.js.org/p/cc37608/ QT学习之路: https://www.devbean.net/

  7. Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实 现)interface(接口

    匿名的内部类是没有名字的内部类.不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现

  8. 传输文件到docker容器

    传输文件到docker容器 首先需要知道docker容器的container_id,可以使用docker ps命令来查看你要操作的docker容器的container_id Docker容器向宿主机传 ...

  9. .net Core之【区域】路由配置

    1.创建项目 现在的项目是比较干净的 2.创建一个区域 创建完成后,会出现一个页面,人家都说了怎么设置路由规则 3.进入Startup.cs文件中添加红色代码 app.UseMvc(routes =& ...

  10. c#种GetType()和TypeOf()的区别

    C#中任何对象都具有GetType()方法,它的作用和typeof()相同,返回Type类型的当前对象的类型. typeof(x)中的x,必须是具体的类名.类型名称等,不可以是变量名称:GetType ...