这节我们继续学习数据类型之间的转换中应该注意到的一些小细节。
数据类型之间的转换有两种:
1.自动类型转换(隐式类型转换)
2.强制类型转换(显式类型转换)
表达式的数据类型自动提升:
所有的byte型,short型和char型的将自动提升为int型;
如果一个操作数是long型,那么计算结果也是long型;
如果一个操作数是float型,那么计算结果也是float型;
如果一个操作数是double型,那么计算结果也是double型;
我们看出占内存小的自动提升为占内存大的数据类型。
而当我们要把占内存大的数据类型转换成占内存小的数据类型时必须要强制转换,当然有可能造成精度降低或溢出,所以在使用时一定要格外注意。
下面我们直接看一段代码,体验一下数据转换中的一些细节。
~~~
class VarDemo2
{
public static void main(String[] args)
{
int x = 3;
x = x + 5;//运算两端必须同类型,一般情况下不同类型是不能运算的
byte b = 5;
x = x + b;//特殊情况下,两端为数值型,类型会自动提升,以占用内存比较大的为主,占用内存小的类型自动提升
byte b1 = 3;
//b1 = b1 + 4;//错误:不兼容类型:从int转换成byte可能会有损失.这里的4是int类型的,相加,b1会自动提升,4个字节存储,不能附值给1个字节的b1
b1 = (byte)(b1 + 4);//强制转换
System.out.println(b1);
b1 = (byte)(b1 + 200);//强制转换
System.out.println(b1);
System.out.println('a' + 1);//结果是98,计算机里面全部是二进制,01100001对应a(二进制和生活中文字对应关系表,也就是编码表,全称ASCII)
System.out.println((char)('a' + 1));//b
System.out.println('你' + 0);//中文对就的是gb2312或者GBK unicode是国际标准码表
System.out.println('0' + 0);
byte b2 = 4;//4还是int类型,在附值过程中会自动检测,并强制转换类型
b2 = 3 + 7;//这个编译通过,因为3和7是常量,是确定的,可以自动检测
byte b3 = 3;
byte b4 = 7;
//b2 = b3 + b4;//这个编译通不过,因为b1和b2是变量,这两值不确定,不能自动检测,报错说丢失精度
int x0;
int x1 = Integer.MAX_VALUE;//这个是取int范围的最大值
int x2 = 2;
x0 = x1 + x2;
System.out.println(x0);//超出int范围
}
}
~~~
结果如下:
![](https://box.kancloud.cn/2016-05-18_573c4170666d4.jpg)
从结果我们很清楚的看到不同数据类型之间的转换结果,以及数据类型的范围溢出等细节问题,在以后的学习中更加注意。
- 前言
- 1.1 基本常识
- 1.2 Java语言概述
- 1.3 Java语言的环境搭建
- 1.4 Java程序开发之初体验--Hello World
- 2.1 关键字
- 2.2 标识符
- 2.3 注释
- 2.4 常量
- 2.5 进制扫盲
- 2.6 变量和数据类型(1)
- 2.7 变量和数据类型(2)
- 2.8 运算符
- 3.1 if语句
- 3.2 switch语句
- 3.3 while和do-while语句
- 3.4 for语句
- 3.5 for循环的嵌套
- 3.6 break语句与continue语句
- 4.1 函数的定义
- 4.2 定义函数的两个明确
- 4.3 函数的内存加载过程
- 4.4 函数的重载
- 5.1 数组的定义
- 5.2 数组的内存分配及特点
- 5.3 数组操作中常见问题
- 5.4 数组常用操作(1)
- 5.5 数组常用操作(2)
- 5.6 二维数组
- 6.1 面向对象的概述
- 6.2 类与对象的关系
- 6.3 对象的内存体现
- 6.4 成员变量与局部变量
- 6.5 类类型参数与匿名对象
- 6.6 基本数据类型参数与引用数据类型参数的传递过程
- 6.7 封装
- 7.1 构造函数概述与默认构造函数
- 7.2 构造函数与一般函数的区别
- 7.3 构造函数的重载
- 7.4 构造函数的内存加载
- 7.5 构造函数需要注意的几个细节
- 7.6 this关键字的原理
- 7.7 this关键字的细节与应用
- 8.1 static关键字之特点
- 8.2 成员变量与静态变量的区别
- 8.3 static关键字使用的注意细节
- 8.4 main函数的解析与细节
- 8.5 static关键字的使用场景
- 8.6 静态的内存加载
- 8.7 静态代码块
- 8.8 构造代码块
- 9.1 继承
- 9.2 单继承与多重继承
- 9.3 子父类中成员变量特征体现