向下转型的安全判断
向下转型的安全判断使用原因
多态实现了引用类型的向上转型,我们也可以进行向下转型,
但是向下转型不一定是安全的,要先进行安全判断,
只有父引用原本指向的类型和与向下转型的类型一致,才能转,
因此我们需要进行向下转型的安全判断
向下转型的安全判断具体方法
1.用instanceof关键字
格式:
父引用 instanceof 子类
其返回的是一个Boolean类型的值
2.用字节码对象去判断
因为一个类只有一个字节码对象,所以只需要将父引用的字节码对象和欲向下转型的类型的字节码对象进行比较,看是否相等也就可以判断算法向下转型安全与否了
格式:
if(父引用.getClass() == 类名.class){
//向下转型
}
具体代码实例:
package com.tan.typecast1;
public class Demo {
public static void main(String[] args) {
// 向上转型
Person person = new Chinese();
// p.dialect 报错,向上转型的弊端:丢失子类的特有成员,无法进行调用
// 向下转型
Chinese chinese = (Chinese)person;
System.out.println("chinese.dialect = " + chinese.dialect);
chinese.eat();
chinese.talk();
System.out.println("===============");
// 向下转型不一定是安全的,要先进行安全判断,只有父引用原本指向的类型和与向下转型的类型一致,才能转
// 判断方法1:
if(person instanceof German){
German german = (German)person;
german.build();
System.out.println("german.location = " + german.location);
}
System.out.println("===============");
// 判断方法2:Chinese类字节码对象 == American类的字节码对象
if(person.getClass() == American.class){
American american = (American)person;
american.hamburger();
System.out.println("american.age = " + american.age);
}
}
}
interface Person{
public abstract void talk();
}
class Chinese implements Person{
String dialect;
@Override
public void talk() {
System.out.println("中国人说汉语");
}
public void eat() {
System.out.println("中国人很会吃美食");
}
}
class American implements Person{
int age;
@Override
public void talk() {
System.out.println("美国人说英语");
}
public void hamburger() {
System.out.println("美国人做的汉堡不错");
}
}
class German implements Person{
String location;
@Override
public void talk() {
System.out.println("德国人说德语");
}
public void build() {
System.out.println("德国人制造业很强");
}
}