前情提要:
- 【2023,学点儿新Java-34】基本数据类型变量 运算规则:自动类型提升、强制类型转换 | 为什么标识符的声明规则里要求不能数字开头?(通俗地讲解——让你豁然开朗!)
- 【2023,学点儿新Java-33】字符型变量char | 布尔类型变量 boolean:true、false
- 【2023,学点儿新Java-32】Java基础小练习:根据圆周率与半径求圆的面积 | 温度转换 | 计算矩形面积 | 判断奇偶数 | 年龄分类
- …
- 更多系列文章,可参阅本专栏或博主主页哦~
坚持和热爱,可填山海之远。
🎯作者主页: 追光者♂🔥
🌸个人简介:
💖[1] 计算机专业硕士研究生💖
🌟[2] 2022年度博客之星人工智能领域TOP4🌟
🏅[3] 阿里云社区特邀专家博主🏅
🏆[4] CSDN-人工智能领域优质创作者🏆
📝[5] 预期2023年10月份 · 准CSDN博客专家📝
- 无限进步,一起追光!!!
🍎感谢大家 点赞👍 收藏⭐ 留言📝!!!
🌿在上一篇中简单介绍了一下java 基本数据类型变量 运算规则中的 强制类型转换的概念,本篇对此做一个简要的补充说明~ 针对强制类型转换中的几个注意要点:即 转换规则、执行时机以及风险与安全等。(此外针对 引用类型的 强制转换,给出了一个简单的实例,不要求初学者看懂哈~~)
🕝目录
- 🍁java中的强制类型转换
- 🍂1.1 补充说明
- 🍂1.2 附:强制类型转换——引用
- 🍂1.3 简单练习:能否编译成功?
🍁java中的强制类型转换
🍂1.1 补充说明
在Java中,强制类型转换(也称为类型转换 或 类型强制转换)是指将一个数据类型转换为另一个数据类型。
强制类型转换通常发生在两个类型之间具有父子关系的时候,即从一个较大的数据类型向一个较小的数据类型转换。强制类型转换需要使用圆括号和目标类型来表示。
强制类型转换的一般语法如下:
目标类型 变量名 = (目标类型) 表达式;
具体来说,强制类型转换有以下几个要点:
-
- 转换规则:只有当两个数据类型之间存在父子关系时,才能进行强制类型转换。
-
基本类型
:可以进行数值之间
的转换(如int转换为short),但是可能会 导致数据溢出或精度丢失。
-
引用类型
:可以进行父类到子类的转换(向下转型),但是 可能会导致类型不兼容的异常(ClassCastException
)。
-
- 执行时机:强制类型转换 是在编译时进行静态检查的。编译器会在进行类型转换时 检查目标类型 是否与源类型存在父子关系,如果不存在则会编译错误。
-
- 风险与安全:由于强制类型转换 可能导致数据丢失或异常,因此需要谨慎使用。在进行强制类型转换时,开发人员需要确保转换是安全的,并进行必要的类型检查和错误处理。
以下是一个较为复杂的示例,演示 强制类型转换的使用情况:
double x = 3.14;
int y = (int) x; // 强制将double类型转换为int类型
System.out.println("x = " + x); // 输出原始值 3.14
System.out.println("y = " + y); // 输出转换后的值 3
在上面的示例中,将一个double类型的变量x强制转换为int类型。由于double类型是一个更大的数据范围,将其转换为int类型会导致小数部分的丢失。在转换后,变量y将包含转换后的整数部分3。
需要注意的是,强制类型转换 可能会导致数据丢失或异常,因此在进行强制类型转换时应谨慎操作,并确保转换是安全的。
🍂1.2 附:强制类型转换——引用
下面是一个较为详细的示例代码,演示在Java中涉及引用类型的强制类型转换的情况:
// 定义一个父类Animal
class Animal {
public void eat() {
System.out.println("Animal is eating.");
}
}
// 定义一个子类Dog,继承自Animal
class Dog extends Animal {
public void bark() {
System.out.println("Dog is barking.");
}
}
// 定义一个子类Cat,继承自Animal
class Cat extends Animal {
public void meow() {
System.out.println("Cat is meowing.");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog(); // 创建一个Dog对象,并将其引用赋值给父类Animal类型的变量
// 使用父类类型的引用,只能访问父类中定义的成员方法
animal.eat();
// 强制类型转换,将父类类型的引用转换为子类类型的引用
Dog dog = (Dog) animal;
// 使用子类类型的引用,可以访问子类中定义的特有方法
dog.bark();
// 将父类类型的引用转换为不相关的子类类型,会导致编译错误
// Cat cat = (Cat) animal; // 编译错误,在运行时会抛出ClassCastException异常
}
}
注:本小节 不要求 初学者 看懂哈~
在上面的示例中,我们定义了一个父类
Animal
,并分别定义了两个子类Dog
和Cat
,它们都继承自 Animal 类。在主方法中,我们首先创建一个 Dog 对象,并将其引用赋值给一个父类 Animal 类型的变量 animal。这是一个向上转型的操作,因为 Dog 是 Animal 的子类。由于引用类型的多态特性,我们可以通过父类类型的引用变量 调用父类 Animal 中定义的方法,即可以调用 eat() 方法。
接着,我们进行了类型转换,将父类类型的引用
animal
强制转换为子类 Dog 类型的引用 dog,这是一个向下转型的操作。使用子类类型的引用 dog,我们可以调用子类 Dog 中特有的方法 bark()。
需要注意的是,这里的强制类型转换是基于我们已经确保了 animal 引用实际指向的是一个 Dog 对象
。如果我们将 animal 引用实际指向的是一个 Cat 对象,那么在进行向下转型时,会抛出 ClassCastException 异常,因为 Cat 和 Dog 之间没有直接的继承关系。
还要注意:在进行类型转换时,需要确保 引用实际 指向的对象的类型与目标类型一致或存在父子关系。否则,在编译时 会出现类型不兼容的错误,或者在运行时会抛出
ClassCastException
异常。因此,在进行强制类型转换时,需要谨慎操作,并进行必要的类型检查和错误处理。
🍂1.3 简单练习:能否编译成功?
/*
此VariableTest4.java用来测试强制类型转换
规则:
1. 如果需要将容量大的变量的类型转换为容量小的变量的类型,需要使用强制类型转换
2. 强制类型转换需要使用强转符:()。在()内指明要转换为的数据类型。
3. 强制类型转换过程中,可能导致精度损失。
*/
class VariableTest4 {
public static void main(String[] args) {
double d1 = 12;//自动类型提升
//编译失败
//int i1 = d1;
int i2 = (int)d1;
System.out.println(i2);
long l1 = 123;
//编译失败
//short s1 = l1;
short s2 = (short)l1;
System.out.println(s2);
//练习
int i3 = 12;
float f1 = i3;//自动类型提升
System.out.println(f1); //12.0
float f2 = (float)i3; //编译可以通过。只不过可以省略()而已。
//精度损失的例子1:
double d2 = 12.9;
int i4 = (int)d2;
System.out.println(i4);
//精度损失的例子2:
int i5 = 128;
byte b1 = (byte)i5;
System.out.println(b1); //-128
//实际开发举例:
byte b2 = 12;
method(b2);
long l2 = 12L;
//编译不通过
//method(l2);
method((int)l2);
}
public static void method(int num){ //int num = b2;自动类型提升
System.out.println("num = " + num);
}
}
同样地,注释内容,大家可以自行打开测试,来看是否编译通过~
🍒 热门专栏推荐:
- 🥇Python&AI专栏:【Python从入门到人工智能】
- 🥈前端专栏:【前端之梦~代码之美(H5+CSS3+JS.】
- 🥉文献精读&项目专栏:【小小的项目 (实战+案例)】
- 🍎C语言/C++专栏:【C语言、C++ 百宝书】(实例+解析)
- 🍏Java系列(Java基础/进阶/Spring系列/Java软件设计模式等)
- 🌞问题解决专栏:【工具、技巧、解决办法】
- 📝 加入Community 一起追光:追光者♂社区
持续创作优质好文ing…✍✍✍
记得一键三连哦!!!
求关注!求点赞!求个收藏啦!