Java中的类型转换

类型转换

引言:

​ java是一门强类型的语言,其中的类型转换分为基本类型转换和强制类型转换,接下来和大家探讨一下转换的注意事项:

一、自动类型转换

1.基本数据类型的自动转换

​ 首先提一下自动类型转换,对于基本类型来说,就是把范围小的数据类型转换为范围大的数据类型。

基本数据类型自动转换

//int --> float
float f = 12;
System.out.println(f);

//float --> double
double d = 12.8F;
System.out.println(d);

这里不推荐使用,即使是范围小的类型转换为范围大的类型,也会出现丢失精度问题,如下代码:

float f1 = 12.8F;   //12.8
System.out.println(f1);
//float --> double
double d = f1;   //12.800000190734863
System.out.println(d);

可以看出float --> double,存储的数据不一致

2.引用数据类型的自动转换

​ 对于引言数据类型来说,就是父类的引用指向子类或者间接子类的对象,或是接口的 引言数据类型指向遵从接口实现类对象【多态】,这也称为向上转型,这种转换是天生安全的。

引用类型的自动转换【向上转型】

class Animal {}

class Monkey extends Animal {}

/**
 * @Author: renlon
 * @Date: 2023/02/27/17:40
 */
public class Demo {
    //父类引用指向子类的对象【多态】
    Animal animal = new Monkey();
}

二、强制类型转换

强制类型转换就是把范围大的数据类型转换为范围小的数据类型。

​ java中的强制类型转换分为基本类型的强制转换和引用类型的强制转换。我们不推荐基本基本类型的强制转换,因为会出现精度的损失。而对于引用数据类型的强转,只要满足真实数据类型与目标数据类型一致,大胆转,不会出现精度丢失,内存丢失的问题。

1.基本类型的强转

这种转换基本不建议使用,因为会出现精度损失和溢出的情况。

语法格式:

范围小的数据类型 变量名 = (范围小的数据类型)范围大的数据类型;

案例:

/**
* 没有精度损失和溢出
*/
int a1 = 12;
int a2 = 23;
byte b1 = (byte) (a1 + a2);  //35
System.out.println(b1);

/**
* 出现了溢出
*/
int a3 = 68;
int a4 = 67;
byte b2 = (byte) (a3 + a4);  //-121
System.out.println(b2);

/**
* 精度损失
*/
double d = 3.14 - 3.12;
float f = (float) d;
System.out.println(d);  //0.020000000000000018
System.out.println(f);  //0.02

上面的代码案例很容易看出基本类型强转的精度损失和溢出问题,所以也建议使用。

2.自动强转的情况

这里引入一个问题,如何将大写字母转换成小写字母。

public class Demo1 {
    public static void main(String[] args) {
        char ch = 'A';

//        ch = ch + 32; 错误方法,
        /**
         * 第一种(错误形式)
         * 32 默认为int类型,ch + 32计算机会默认当前类型为int
         * 把int类型的变量赋值给char,会报错
         */

        ch += 32;   //正确
        //自带特殊功能,可以满足类型转换的需求。

        ch += ('a' - 'A');  //标准形式(严格遵守类型一致化要求)
    }
}

3.引用类型的强转

引用类型的强转也称为向下转型,

class Animal {
}

class Monkey extends Animal {
}

class Cat extends Animal {
}

/**
 * @Author: renlon
 * @Date: 2023/02/27/17:40
 */
public class Demo {
    public static void main(String[] args) {
        //父类引用指向子类的对象【多态】
        Animal animal = new Monkey();

        //强转,也称向下转型
        Monkey monkey = (Monkey) animal;

        //错误强转(类型不一致)
        Cat cat = (Cat) animal; //ClassCastException
    }
}

在这里插入图片描述

上图是引用数据类型强转的图示,首先声明父类引用指向子类对象,强转成Monkey类型相当于讲animal对象的地址赋值给monkey。

​ 由上面的案例可以看出,引用数据类型的强转,只要真实的数据类型满足和目标数据类型一致,那么在强转的过程中不会涉及到数据丢失,精度丢失,内存丢失的问题。如果精度不一致,那么强转会导致ClassCastException(类型转换异常)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值