一 面向对象中三
1 多态如何才能调用子类特有的属性和方法?
1.1 向上转型(多态)、向下转型
Person p2 = new Man();//多态
Man m1 = (Man)p2;//向下转型
m1.earnMoney();//调用子类特有的属性和方法
m1.isSmoking = true;//调用子类特有的属性和方法
1.2 风险
强制类型转化风险:精度损失
向下转型风险:转不成功
//Person p2 = new Man();
Woman w1 = (Woman)p2;
w1.goShopping();//出错,java.lang.ClassCastException 类型转换异常
2 instanceof操作符
2.1 格式
x instanceof A:检验x是否为类A的对象,返回值为boolean型,如果是,返回ture,否则false
2.2 注意
-
要求x所属的类与类A必须是子类和父类的关系,否则编译错误
-
如果x属于类A的子类B,x instanceof A值也为true
(如果类B是类A的父类,则【a instanceof A】返回ture 【a instanceof B】也返回ture。)
2.3 代码
使用情景:为了避免在向下转型时出现java.lang.ClassCastException类型转换异常,所有在向下转型之前,先进行instanceof判断,一旦返回true,就进行向下转型,如果返回false,不进行向下转型
if(p2 instanceof Man){
//ture
Man m1 = (Man)p2;//向下转型
m1.earnMoney();
}
if(p2 instanceof WoMan){
//false
Woman w1 = (Woman)p2;//向下转型
w1.goShopping();
}
2.4 练习
2.4.1 编译时通过,运行时不通过
Person p3 = new Man();
Woman w3 = (Woman)p3;
Person p3 = new Person();
Woman w3 = (Woman)p3;
2.4.2 编译时通过,运行时通过
Object obj = new Man();//Man p = (Man)obj;
Person p = (Person)obj;//强转成Man都是,Person更可以
A 要想向下转型成功,则new的是B或子类的C
↓ A a = new B();// A a = new C();
B B b = (B)a;
↓ C b = (C)a;
C
2.4.3 编译不通过
Man m5 = new Woman();
3 多态练习(开发不要出现,练习而已)
class Base{
int count1 = 1;
int count = 10;
public void display(){
System.out.println(this.count);
}
}
class Sub extends Base{
int count2 = 2;
int count = 20;