前些阵子简单学了些JavaScript,然后最近开始接触Java语言,虽说二者名字挺像,倒是也没太大关系(雷锋和雷峰塔的关系),而且学到了数据类型的时候,更是发现二者在数据类型方面相当不一样
Java是强类型语言,而JavaScript是弱类型语言
这个就不一一举例了,毕竟今天的重点是Java的类型转换。
Java的基本数据类型:一共4大种8小种
首先来看一下这几大类型的取值范围:
容量比较:byte < short = char < int < long < float < double
之后引入两个个概念:
自动类型转换:小容量-数据类型转化为大容量时使用
强制类型转化:大容量数据类型转化为小容量时使用
强制类型转化需要在字面值前加上(数据类型),转化后可以通过编译,但会损失精度,所以谨慎使用
简单来说,如果你的字面值大于变量的数据类型,那么系统在编译阶段就会报错,然后你这时就需要使用强转。
但强制转换会损失精度(涉及到原码反码补码的概念,和二进制有关,这里不讲),需要谨慎使用
了解了上述几个概念,我们就可以开始这几个基本类型的转换实验了:
整型:java语言中的整数型字面值默认为int类型,若想该整数型字面值被当作long类型处理,除了声明数据类型为long,还需要在整数型字面值后加l/L。
那么如果我不加L呢?结果输出的是不是int类型?
public class Main {
public static void main(String[] args) {
long a = 40;
System.out.println(getType(a));
}
//输出变量类型的方法
public static String getType(Object o){
return o.getClass().toString();
}
}
最后结果是long类型,因为int类型容量小于long类型,Java已经做了自动转换,将其转换成了long类型。
不过需要注意,因为右边的字面量是int类型,如果这个值超出了int类型的范围,那么此时就会直接报错;而且为了代码规范起见,还是老老实实在后面加上L吧。
long a = 2147483648;//此时就会报错,需要加上L
long a = 400L;//为了规范起见,还是加上L吧
byte、short、char类型:我们都知道这三个类型大小低于int类型。那么在保证不溢出的情况下,我不加强转,会不会报错呢?
下面拿byte类型的举个例子:
public class Main {
public static void main(String[] args) {
byte a = 40;
System.out.println(getType(a));
}
//输出变量类型的方法
public static String getType(Object o){
return o.getClass().toString();
}
}
结果还是自己的类型,说好的字面值是int类型的呢?不强转也不报错,搁这涮猴儿呢?
其实不然,编译器通过检测发现字面值没有超过byte值的容量范围,所以默许这种赋值,从最后的输出结果来看,可以理解成强制转换成了byte类型,反正不超过范围。
不过,如果超过了范围,那么就需要手动加上括号做强制转换了。但还是那句话,强转有风险,使用需谨慎
浮点类型:java中的浮点型字面值默认为double类型,若想该浮点型字面值被当作float类型处理,除了声明数据类型为float,还需要在浮点数字面值后加f/F。
这个和long类型不一样,是必须得加符号的。因为double类型容量是要大于float的,大转小必须强制转换,否则会报错!
float a = 30.0F;