Java基本类型转换中有关字面量默认类型的那点儿事

前些阵子简单学了些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;

猜你喜欢

转载自blog.csdn.net/Marshallren/article/details/104705212