JAVA学习【知】向上转型

 在初学习JAVA时对向上转型很迷茫,不知道他是如何调用的,感觉很神奇。经过咨询终于对向上转型有了点感觉,呵呵 下面一个程序是在网上看到的,对学习向上转型有很大的帮助所以我就转过来和大家分享。

 

 

 

Java中的向上转型,说得简单点就是把基类看成是父类。这样说应该不难理解。例如,在经典的Shape类中,Circle和Square均继承自Shape。我们可以说,一个Circle是一个Shape,一个Square也是一个Shape。这就是is-a关系。Shape能做的事情,Circle和Square也能做。先看下面的这段代码:
       


 

  1. public class A {
  2. public static void main(String[] args) {
  3. Circle1 c = new Circle1();//可替换为Shape1 c = new Circle1();
  4. Square1 s = new Square1();//可替换为Shape1 s = new Square1();
  5. doStuff(c);
  6. doStuff(s);
  7. }
  8. public static void doStuff(Shape1 shape) {
  9. shape.move();
  10. shape.stop();
  11. }
  12. }
  13. class Shape1 {
  14. void move() {
  15. }
  16. void stop() {
  17. }
  18. }
  19. class Circle1 extends Shape1 {
  20. void move() {
  21. System.out.println("Circle moves");
  22. }
  23. void stop() {
  24. System.out.println("Circle stops");
  25. }
  26. }
  27. class Square1 extends Shape1 {
  28. void move() {
  29. System.out.println("Square moves");
  30. }
  31. void stop() {
  32. System.out.println("Square stops");
  33. }
  34. }

我们先定义一个Shape1类,里面有两个方法,一个是move(), 一个是stop()。这两个方法什么也不做(抽象类和接口里会有类似的什么也不做的方法,不过这里不是重点)。然后定义两个继承自Shape1的类,Circle1和Square1。它们覆盖了Shape1中的move和stop方法,彼此不相同。这里,我只是简单的输出一些消息,以表示两个子类的方法内容并不相同而已。
然后需要注意的就是public static void doStuff方法了。注意它的参数,是一个Shape1类型的对象。在定义这个方法的时候,我们让它执行shape的move和stop方法,但是并没有说明到底是Circle1类还是Square1类。但是执行后在结果中会看到c执行了Circle1的方法,s执行了Square1的方法。这是如何做到的?其中涉及一个“动态绑定”的概念。“动态绑定”就是说在运行时刻才知道对象具体是哪一个类的,并不是在你写代码的时候就确定参数对象是哪一个类的。这是Java的一个特点,也是OOP的一个特点。
这里我们用到了向上转型,即将Shape1这个父类的一个对象提供给doStuff方法作为参数,而不是具体的Circle1或者Square1对象作为参数。这样,我们只需要创建Circle1和Square1对象,并将它们作为参数传给doStuff方法就可以了。因为Circle1和Square1继承自Shape1,所以,它们也可以被看成是Shape1类型的,doStuff就不会提示你参数类型不正确的信息,并且能够在运行时刻自动找到合适的方法来执行。这样,代码很明显简洁,不会出现繁琐冗长的样子。这就是向上转型的好处,当然还有动态绑定的作用在里面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值