向下转型 instanceof
//有了对象的多态性以后,内存总实际上是加载了子类特有的属性 方法的 但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性
//方法。子类特有的属性和方法不能调用。
//如何才能调用子类特有的属性和方法?
//洗向下转型 使用强制类型转化符
Man m1 = (Man)p2;
m1.earnMoney();
m1.isSmoking = true;
//使用强转时 可能出现 ClassCastException异常
/* Woman w1 = (Woman)p2;
p2.shopping(); */
/*
* instanceof 关键字的使用
* a instanceof A : 判断对对象a是否是类A的实例 如果是返回true 如果不是 返回false
*
*
* 使用情景 为了避免向下转型时出现ClassCastException的异常,则先进行instanceof的判断,一旦返回true则进行向下转型
* 如果返回false 则终止向下转型
*
* 如果 a instanceof A返回true 则 a instanceof B 也返回true
* 其中 类B 是 类A的父类
*/
if (p2 instanceof Woman) {
Woman w1 = (Woman)p2;
w1.goShopping();
System.out.println("******Woman**********");
}
if(p2 instanceof Man) {
Man m2 = (Man)p2;
m2.earnMoney();
System.out.println("**********Man*************");
}
if(p2 instanceof Person) {
System.out.println("*******Person*********");
}
if(p2 instanceof Object) {
System.out.println("*******Object*********");
}
//练习:
//问题1:编译通过 运行不通过
/* Person p3 = new Woman();
Man m3 = (Man)p3; */
/* Person p4 = new Person();
Man m4 = (Man)p4; */ //错误 因为new的是Person,此并内有利用多态性
//问题2:编译通过,运行也通过
Object obj = new Woman();
Person p = (Person)obj;
//问题3;编译不过 运行不过
/* Man m5 = new Woman(); */
}
}