Java 自动类型转换,强制类型转换

一. 自动类型转换[熟知]

举个例子,便于理解

 public static void main(String[] args) {
        byte a = 20;
        int  b = a;
    }

java遵循类型匹配原则 ,但是为什么 byte 类型的a 能赋值给 int 类型的b
因为此时发生了自动类型转换
public static void main(String[] args) {
        char a = 105;
        System.out.println(a );
}

这就是取值范围小的byte会自动转换成int类型,
在这里插入图片描述这是类型的范围从小到大的转换图.

二.强制类型转换[熟知]

同样举个例子,便于理解

 public static void main(String[] args) {
        int a = 20;
        // Incompatible types.Required:byte Found:int 
        byte b = a;
 }
//此时我们如果还需要赋值 就可以使用强制类型转换: 在需要转换的类型前面添加 (需要转成的类型)
 public static void main(String[] args) {
        int a = 20;
        byte b = (byte) a;
    }
//但是注意 强制类型转换其实就是欺骗编译器,运行的时候可能会出现数据溢出的情况
public static void main(String[] args) {
        int a = 129;
        byte b =  (byte)a;
        System.out.println(b);
 }
//此时数据溢出 输出-127 为啥是-127原因是经过了二进制的原码 反码 补码等运算

强制类型转换格式:
在强制类型前面加括号,里面写下你要强制转换的类型;
eg: int a = 20;
byte b = (byte)a;

三. 隐式类型转换[熟知]

举个例子好理解

public static void main(String[] args) {

       
        byte  a = 128;
       
        float b = 20.5;

}
//说明 直接写的常量数字 也是有数据类型的 , 10 数据类型是 int  20.5数据类型是double
//但是 我们这样赋值就不会出问题
public static void main(String[] args) {
        byte  a = 127;
 }
//此时127还是int 但是在byte的范围之内 所以发生了隐式类型转换
public static void main(String[] args) {
        float  a = 20.5F;
        long   b = 999999999999L;
}
//还有一种情况,也是一道经典的面试题:请问以下代码有问题吗?为什么?
 public static void main(String[] args) {
        short a = 10;
        a = a +5;
        
        short b = 20;
        b+=5;
}
//第一个a=a+5有问题 a+5的结果会自动提升为int 但是 b+=5不会出问题因为最底层代码是  b =  (short)(b+5);
public static void main(String[] args) {
     short  s1 = 10;
     short  s2 = 20;
     short  s3 = s1+s2;
}

关于类型转换大致就是这些,希望大家认真理解,都是干货,最后谢谢大家的点赞关注


版权声明:本文为QAQwin原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。