java向上转型与向下转型

向上转型与向下转型

面向对象(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"

向上转型的好处

  • 减少重复代码,使代码变得简洁。
  • 提高系统扩展性。

向下转型

与向上转型相对应的就是向下转型了。向下转型是把父类对象转为子类对象。

向下转型注意事项

  • 向下转型的前提是父类对象指向的是子类对象(也就是说,在向下转型之前,它得先向上转型)
  • 向下转型只能转型为本类对象

 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值