引用知识点:
https://blog.csdn.net/weixin_41117393/article/details/103522415
一、子类转父类
// 向上转换,是可以的
package ia2_objectChange;
// 对象转型
public class ObjectChange {
public static void main(String[] args) {
// 1-子类转父类 向上 可以转
Hero h = new Hero();
ADHero ad = new ADHero();
h = ad; // 子类转父类,可以转 ,物理攻击英雄当作英雄使用
// h -> Hero对象
// ↘
// ↘
// ad -> ADHero对象
}
}
二、父类转子类
// 向下转换,是不确定的
package ia2_objectChange;
public class ObjectChange2 {
public static void main(String[] args) {
Hero h = new Hero();
ADHero ad = new ADHero();
h = ad;
// 2-父类转子类,向上,强转类型转换,有时可以,有时不可以
// 2-1 可以强转
ad = (ADHero) h; // 父类转子类,强转
// h引用指向ADHero对象,ADHero转换成ADHero,可以转
// 2-2 不可强转
Support s = new Support();
h = s; // 子类转父类,可以转,辅助类英雄当作英雄使用
ad = (ADHero) h; // 编译报错,ClassCastException 类转换异常
// 辅助类英雄当作物理攻击英雄来使用,行不通
}
}
三、实现类转接口
// 向上转换,是可以的
package ia2_objectChange;
public class ObjectChange3 {
public static void main(String[] args) {
// 3-实现类转接口,向上,可以转
ADHero ad = new ADHero();
AD adi = ad; // 实现类转接口,可以转
// ADHero类实现接口AD,提供了AD接口中的物理攻击方法
adi.phsyicAttack(); // 物理攻击
}
}
四、接口转实现类
// 向下转换,是不确定的
package ia2_objectChange;
public class ObjectChange4 {
public static void main(String[] args) {
// 4-接口转实现类,强转,有时可以,有时不可以
//
ADHero ad = new ADHero();
AD adi = ad;
// 4-1 可以强转
ADHero adHero = (ADHero) adi;
// adi引用指向ADHero,可以转换
// 4-2 不可强转
ADAPHero adap = (ADAPHero) adi; // 报错,ClassCastException,类转换异常
// 接口AD不能转换成实现类ADAPHero
// adi引用指向ADHero,ADHero转换成ADAPHero,意味着可以调用魔法攻击方法magicAttack()
// 但ADHero并没有魔法调用方法,ADHero不能转换成ADAPHero
}
}
五、没有继承关系进行转换,肯定会失败
package ia2_objectChange;
public class ObjectChange5 {
public static void main(String[] args) {
// 5-无继承关系进行类型转换
ADHero ad = new ADHero();
APHero ap = new APHero();
//ad = (ADHero)ap; // 报错,没有继承关系的两个类进行类型转换一定会失败
}
}
六、instanceof
package ia2_objectChange;
public class InstanceofTest {
public static void main(String[] args) {
// 6-扩展 instanceof,判断一个引用指向的对象是否是该类或其子类
Hero h = new Hero();
ADHero ad = new ADHero();
h = ad;
System.out.println(h instanceof Hero); // true
System.err.println(h instanceof ADHero); // true
}
}
七、练一练
// 是不是相同的效果呢?
package ia2_objectChange;
public class ObjectChange6 {
public static void main(String[] args) {
// 7-练习
Hero h = new Hero();
AD adi = (AD) h; // 报错,ClassCastException,类转换异常
// Hero不能转换成接口AD,Hero未实现接口AD
ADHero ad = (ADHero) adi;
}
}
我的学习源泉:https://how2j.cn/k/interface-inheritance/interface-inheritance-casting/308.html?p=114999
Java自学网站:https://how2j.cn?p=114999