理解:
有一个对象 new ADHero(), 同时也有一个引用ad
对象是有类型的, 是ADHero
引用也是有类型的,是ADHero
一般来说引用类型和对象类型是一样的,当引用类型和对象类型不一致就要考虑类型转换
简单判断:把右边的当做左边来用,看说得通不
向上转型
将子类转换为父类,因为子类包含于父类,所以说得通
类转换成接口
向下转型
慎重判断,如果没有继承关系一定会失败
接口也有可能失败,主要其实看接口的继承关系
package charactor;
public class Hero {
public String name;
protected float hp;
public static void main(String[] args) {
ADHero ad = new ADHero();
AD adi = ad;
ADHero adHero = (ADHero) adi;
ADAPHero adapHero = (ADAPHero) adi;
adapHero.magicAttack();
}
}
10行: ad引用指向ADHero, 而adi引用是接口类型:AD,实现类转换为接口,是向上转型,所以无需强制转换,并且一定能成功
12行: adi实际上是指向一个ADHero的,所以能够转换成功
14行: adi引用所指向的对象是一个ADHero,要转换为ADAPHero就会失败。
假设能够转换成功,那么就可以使用magicAttack方法,而adi引用所指向的对象ADHero是没有magicAttack方法的
instanceof
instanceof Hero 判断一个引用所指向的对象,是否是Hero类型,或者Hero的子类