向上转型用的更多一些
package com.atguigu.java;
public class PersonTest {
public static void main(String[] args){
//对象的多态性:父类的引用指向子类的对象
Person p2 = new Man();
//多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法—-虚拟方法调用
p2.eat();
p2.walk();
System.out.println(“**“);
//不能调用子类所特的方法、属性:编译时,p2是Person类型。
// p2.earnMoney();
// p2.isSmoking();
//有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量
//声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特的属性和方
//法不能调用。
//如何才能调用子类特有的属性和方法?
//向下转型:使用强制类型转换符
Man m1 = (Man)p2;
m1.earnMoney();
m1.isSmoking = true;
//使用强转时,可能出现ClassCastException的异常。
// Woman w1 = (Woman)p2;
// w1.goShopping();
/
instanceof:关键字的使用
a instanceof A:判断对象a是否是类A的实例。如果是返回true;如果不是,返回false
使用情景:为了避免在向下转型是出现ClassCastException的异常,我们在向下转型之前,先进
行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,则不进行向下转型。
/
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**“);
}
//练习:
//问题一:编译时通过,运行时不通过
//举例一:
// Person p3 = new Woman();
// Man m3 = (Man)p3;
//举例二;
// Person p4 = new Person();
// Man m4 = (Man)p4;
//问题二:编译时通过,运行时也通过
Object obj = new Woman();
Person p = (Person)obj;
//问题二:编译不过,运行也不过
// Man m5 = new Woman();
// String str = new Date();
}
}