向上转型与向下转型
面向对象(c# Java AS3.0)编程(oop)中多态,分为向上转型和向下转型。
假定父类为 动物,子类为狗,父类有一个方法发声(),狗继承并覆盖了一个发声方法。在子类重写该方法
则(以下过程c#实现):动物 a=new 狗();//这就为向上转型a.发声();
在调用 a.发声();时调用的是狗的发声()也可调动物类其他方法 但不能调用狗类方法
若修改为动物 a=new 狗();
狗b=(狗)a;//这里向下转型
这时b可调用动物类未被重写的方法和狗类所有方法(包括重写动物类的方法)
向上转型都会成功,是安全的。 就像说狗是动物没问题。
接上面
动物 a=new 动物();
a.发声();//调动物类方法
狗 b=(狗)a;//这也是向下转型 但下面通过b若调用 动物 或 狗类中任意方法都报异常
也就是说向下转型可能会出错 不能说动物是狗
向上转型
向上转型,JAVA中的一种调用方式。向上转型是对A的对象的方法的扩充,即A的对象可访问B从A中继承来的和B复写A的方法。子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口。
public class up{
public static void main(String[] args){
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println("⑴ " + a1.show(b));
System.out.println("⑵ " + a1.show(c));
System.out.println("⑶ " + a1.show(d));
System.out.println("⑷ " + a2.show(b));
System.out.println("⑸ " + a2.show(c));
System.out.println("⑹ " + a2.show(d));
System.out.println("⑺ " + b.show(b));
System.out.println("⑻ " + b.show(c));
System.out.println("⑼ " + b.show(d));
}
}
class A {
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
}
class B extends A {
public String show(B obj) {
return ("B and B");
}
public String show(A obj) {
return ("B and A");
}
}
class C extends B {
}
class D extends B {
}
分析:
当父类对象引用变量引用子类对象时,被引用对象的类型决定了调用谁的成员方法,引用变量类型决定可调用的方法。
如果子类中没有覆盖该方法,那么会去父类中寻找。
1.a1.show(b));Class A 中没有show(B obj),B转向B的父类A,执行A show(A obj)--->return "A and A"
2.a1.show(c));Class A 中没有show(C obj),C转向C的父类B,Class A 中没有show(B obj),再转向父类A,执行A show(A obj)--->return "A and A"
3.a1.show(d));Class A 中有show(D obj)执行A show(D obj)--->return "A and D"
4.这个比较特殊:A a2 = new B();父类声明,子类实例,你应该把a2当作子类重写完后的父类看,注意只有父类的方法。
a2.show(b));Class A 中没有show(B obj),B转向B的父类A,执行A show(A obj),A的show 方法被重写,执行B show(A obj)--->return "B and A"
5.a2.show(c));Class A 中没有show(C obj),C转向C的父类B,Class A 中没有show(B obj),B转向父类A,执行A show(A obj),A的show 方法被重写,执行B show(A obj)--->return "B and A"
6.a2.show(d));Class A 中有show(D obj)执行A show(D obj)--->return "A and D"
7.b.show(b)); Class B 中有show(B obj)--->return "B and B"
8.b.show(c)); Class B 中没有show(C obj),C转向C的父类B,执行B show(B obj)--->return "B and B"
9.b.show(d)); Class B 中有继承了Class A 的show(D obj),执行A show(D obj)--->return "A and D"
向上转型的好处
- 减少重复代码,使代码变得简洁。
- 提高系统扩展性。
向下转型
与向上转型相对应的就是向下转型了。向下转型是把父类对象转为子类对象。
向下转型注意事项
- 向下转型的前提是父类对象指向的是子类对象(也就是说,在向下转型之前,它得先向上转型)
-
向下转型只能转型为本类对象