数据转换
变量在第(3)篇中有讲到过八种数据类型,分别是能够用来表示整型的 byte、short、int、long 和表示浮点型的 float、double 以及字符型 char、布尔型 boolean。
那就又衍生了一个问题:我怎么让 int 型的 1 转成 byte 型的 1 呢?
so easy,把 byte 型变量赋值给 int 型就可以啦~
byte a = 1;
int b = a; // 这时候b的值就会是1了
像这样就完成了转换。
然鹅,这里要注意的是因为是从范围小的 byte 转成范围大的 int,所以可以直接转。那么如果是从范围大的 int 转成范围小的 byte 呢?
我们就需要给后面的值做一个强调,like this:
int a = 1;
byte b = (byte) a;
这个操作【(byte)
】就是强转了。当然,如果 a 是超过了 byte 的范围 - 128~127 的话,那么就会丢失精度。比如:
int a = 130;
byte b = (byte)a;
System.out.println("b="+b);
130 超过 127 了吧,我们看看运行结果:
结果并不是 130:
是的,结果果然就不是 130,而变成了 - 126。Java 在这个强转之后把多余的 2 加上了 (-128) 就成了 - 126 了。所以呀,强转要注意范围区间哟!
好了,讲到这里,需要给三个定义了:
- 优先级:是根据数据类型分配空间的大小,取值范围的不同来划分。(按字节呗,详见下表)
- 从优先级低的数据类型转成优先级高的数据类型是可以直接进行转换的,这种转换就叫隐式类型转换。
- 从优先级高的数据类型转成优先级低的数据类型是不能直接进行转换的,需要进行强转,这种转换就叫显式类型转换。
![上次写的数据类型表](https://upload-images.jianshu.io/upload_images/16885258-8ba7a50bc32155bb.png)
补充——自动类型转换 20190422
1. 自动类型转换
容量小的数据类型可以自动转换成容量大的数据类型(容量是说的范围哦,转换时会损失一定的精度)
整型常量可以直接赋值给 byte、 short、 char 等类型变量,但是要求不超出其范围。
2. 在进行相对变量类型来说较大数值的计算的时候,要注意自动转换引起的数据溢出问题:
int money = 100000000; //1亿
int years = 22;
//int类型大约为21亿,wage为22亿,超过了int的范围
int wage = money*years;
System.out.println("wage="+wage);
//因为是两个int值相乘,所以结果仍然为int值,在转成long之前就已经造成了数据溢出
long wage1 = money*years;
System.out.println("wage="+wage1);
//先将一个数变成long,以long型与int型进行计算,结果自动转为long型
long wage2 = money*((long)years);
System.out.println("wage="+wage2);
输出结果:
所以建议大家在做运算的时候,如果结果有溢出的可能就将第一个操作数转型为更大的数据类型。
引用类型
除了上表中八种基本类型之外,Java 还有一种比较特殊的类型,叫引用类型。
引用了,就是在别的地方写好了,我在这里用嘛~ Java 的引用类型只想的是一个对象,不是像 byte、int 这种是一个原始值。
当然了,既然叫引用类型,那么根据它引用的对象的不同,我们大致上可以把引用类型分为三种,类、接口和数组。(就这么一说,之后再仔细讲)。
那么怎么用呢?比如说我这里有个用户实体类(User),那么我们用的时候就是
User user = new User();
这里的user
变量就是引用类型啦~
当然,常用的 String 也是一个类,
String str = "ahan";
这个 str 也是引用类型哦~
补充——引用类型默认 20190421
对于引用类型来说,其默认值是 null,没有任何指向的内存空间。
那么数组也是引用类型,在声明的时候如果没有直接给元素的话,那么其默认值为 null。
以上,阿里嘎多,20190406 from ahanwhite。