深入理解:全网最详细解释。什么情况下,才可以使用Java“强制类型转换”

本文深入探讨了Java中的数据类型转换,包括基本数据类型之间的自动和强制转换,引用数据类型的转换规则,以及类与接口之间的转换。特别指出,基本数据类型与引用数据类型之间无法直接转换,并强调了字符串与基本数据类型转换的注意事项,如需转换需借助特定方法。此外,还讲解了多态在类型转换中的应用。
摘要由CSDN通过智能技术生成

深入理解:全网最详细解释!什么情况下,才可以使用Java“强制类型转换”!

一· 在java中,数据类型分为两种:

(1)“基本数据类型”:Java中只有八大基本数据类型(char,byte,short,int,long,float,double,boolean)

(2)“引用数据类型”:变量位置上存储的是某个数据的内存地址。(换种说法,就是非基本数据类型都是引用数据类型)

二·“基本数据类型”之间的类型转换:

(1)自动类型转换:容量小的类型自动转换为容量大的数据类型。

(2)强制类型转换:容量大的转换为容量小的数据类型

强制(自动)转换类型语法格式:举例如下:

int i = 21;
double d = 21.333;

//自动转换类型
double i2 = (double) i;//完整语法格式
double i3 = i;//省略语法格式

//强制转换类型
int d2 = (int) d;//只能这样转换,没有省略格式

数据类型按容量大小且自动类型转换排序为:
在这里插入图片描述
注意:

(1)byte,short分别与char两两之间转换,不能使用自动类型转换。

(2)byte,short分别与char两两之间转换,只能使用强制转换。但是这样很容易造成精度丢失,导致转换数据不准确!!!因为他们之间转换,都会首先转换为int类型,再转换为他们之间的其他类型数据。然而他们本身存储数据范围很小,大于128就会转换出错。所以谨慎使用!!!

(3)char可以隐式转换为int类型,即,可以直接给int类型直接赋值单个字符。int类型变量转char类型需要强转,但是可以给char类型直接赋值不超过2字节范围的常量数值(会自动强转)。

(4)byte与short之间,既可以使用自动类型转换,也可以使用强制类型转换。因为他们本质都属于整型数据,只是存储数据范围不同。

(5)boolean类型不能与其它数据类型运算,否则报错。

(6)String类型是引用类型数据,也不能与这8种基本数据类型转换,否则报错

三·“引用数据类型”之间的类型转换:举例说明

前提:创建三个JavaBean类

1.创建一个JavaBean类(Book类):

public class Book {
    private int id;
    private String name;

    public Book() {
    }

    public Book(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void allBooks(){
        System.out.println("Book,总共有54本书!");
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

2.创建一个JavaBean类(Father类):

public class Father {
    private String name;
    private int age;
    private String sex;

    public Father() {
    }

    public Father(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public void eat(){
        System.out.println("father 什么都能吃!");
    }
    public void sleep(){
        System.out.println("father 什么时候都能睡!");
    }

    @Override
    public String toString() {
        return "Father{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

3.创建一个JavaBean类(Son类且继承Father类):

public class Son extends Father{
    private String name;
    private int age;
    private String sex;

    public Son() {
    }

    public Son(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int getAge() {
        return age;
    }

    @Override
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String getSex() {
        return sex;
    }

    @Override
    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public void eat(){
        System.out.println("son 吃米饭!");
    }
    @Override
    public void sleep(){
        System.out.println("son 11点睡!");
    }
    public void run(){
        System.out.println("son 每晚都会跑步!");
    }
    @Override
    public String toString() {
        return "Son{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }

}

情况一:两个没有任何关系的自定义类,不能互相强制类型转换

在这里插入图片描述

情况二:两个自定义类之间有继承关系时,一种情况不可以强转,二种情况可以强转

(1)第一种情况:不能直接将创建的父类对象,强制转换为子类类型

关于强制类型转换,编译器在编译时只会检查类型之间是否存在继承关系,有则通过,否则报错;而在运行时就会检查它的真实类型,能够转换则通过,否则抛出ClassCastException异常。
在这里插入图片描述

(2)第二种情况:可以将子类型对象,强制转换为父类类型。(结果类似多态情况)

(本质是削弱子类型的功能,只具备与父类同属性的功能,其他的功能存在,但是不能调用。)在这里插入图片描述

(3)第三种情况:可以将父类引用的子类对象(多态),强制转换为子类类型。(本质是恢复子类的功能)

在这里插入图片描述

四·类与接口之间的强制类型转换:

(1)类与接口之间的强制类型转换规则,与上文第三项类似。只不过类与接口之间存在的是实现关系,不是继承关系罢了。因此本人不再重复叙述。

五·“基本数据类型”与“引用数据类型”之间的强制类型转换:无法转换!!!(举例说明)

(1)String类型强转为int类型:直接报错,强转失败

在这里插入图片描述

(2)int类型强转为String类型:直接报错,强转失败

在这里插入图片描述
注意: 至于其他类型与String类型之间的转换,读者可以自己去试一试,应该是不会成功的!!!

(3)“基本数据类型”与“自定义类”之间的相互转换类型,也是不可以的。这比转String类型还离谱!!!

总结:“基本数据类型” 无法与 “引用数据类型” 进行强转!!!

六·关于Java数据类型转换的一些其他注意要点:

(1)那些能直接进行“字符串”与“基本数据类型”转换的情况,都是需要调用某些方法才能实现!(例如包装类中的parseInt()方法等等)

(2)有的看似可以从父类强制转换为子类,且可以正常调用子类方法的情况;其实质是:该子类在前面的时候,提前强制转换为了父类;所以后面可以再从父类强制转换为子类。(也就是Java中的多态运用情况)

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ideal-cs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值