当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:17:00  来源:本站整理

在java中产生切确的行为[Java编程]

赞助商链接



  本文“在java中产生切确的行为[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

知道Java里绑定的全部办法都通过后期绑定具有多形性今后,便可以呼应地编写自己的代码,令其与底子类沟通.此时,全部的衍生类都保证能用相同的代码正常地工作.大概换用另一种办法,我们可以“将一条消息发给一个对象,让对象自行判断要做什么事情.”

在面向对象的程序计划中,有一个经典的“形状”例子.由于它很简单用可视化的情势表现出来,所以常常都用它阐明问题.但很不幸的是,它大概误导初学者认为OOP只是为图形化编程计划的,这种熟习当然是错误的.

形状例子有一个底子类,名为Shape;别的还有大量衍生范例:Circle(圆形),Square(方形),Triangle(三角形)等等.大家之所以喜好这个例子,因为很简单理解“圆属于形状的一种范例”等概念.下面这幅担当图向我们展示了它们的关系:

上溯造型可用下面这个语句简单地表现出来:

Shape s = new Circle();

在这里,我们成立了Circle对象,并将后果句柄当即赋给一个Shape.这表面看起来仿佛属于错误操作(将一种范例分配给另一个),但实际是完好可行的——因为按照担当关系,Circle属于Shape的一种.因此编译器承认上述语句,不会向我们提醒一条出错消息.
当我们调用此中一个底子类办法时(已在衍生类里覆盖):
s.draw();
一样地,大家大概认为会调用Shape的draw(),因为这毕竟是一个Shape句柄.那么编译器怎样才能知道该做其他任何事情呢?但此时实际调用的是Circle.draw(),因为后期绑定已经参与(多形性).
下面这个例子从一个略微差别的角度阐明了问题:

//: Shapes.java
// Polymorphism in Java

class Shape { 
  void draw() {}
  void erase() {} 
}

class Circle extends Shape {
  void draw() { 
    System.out.println("Circle.draw()"); 
  }
  void erase() { 
    System.out.println("Circle.erase()"); 
  }
}

class Square extends Shape {
  void draw() { 
    System.out.println("Square.draw()"); 
  }
  void erase() { 
    System.out.println("Square.erase()"); 
  }
}

class Triangle extends Shape {
  void draw() { 
    System.out.println("Triangle.draw()"); 
  }
  void erase() { 
    System.out.println("Triangle.erase()");
  }
}

public class Shapes {
  public static Shape randShape() {
    switch((int)(Math.random() * 3)) {
      default: // To quiet the compiler
      case 0: return new Circle();
      case 1: return new Square();
      case 2: return new Triangle();
    }
  }
  public static void main(String[] args) {
    Shape[] s = new Shape[9];
    // Fill up the array with shapes:
    for(int i = 0; i < s.length; i++)
      s[i] = randShape();
    // Make polymorphic method calls:
    for(int i = 0; i < s.length; i++)
      s[i].draw();
  }
} ///:~
针对从Shape衍生出来的全部东西,Shape成立了一个通用接口——也就是说,全部(多少)形状都可以描绘和删除.衍生类覆盖了这些定义,为每种特别范例的多少形状都供应了举世无双的行为.
在主类Shapes里,包含了一个static办法,名为randShape().它的作用是在每次调用它时为某个随机挑选的Shape对象生成一个句柄.请注意上溯造型是在每个return语句里发生的.这个语句获得指向一个Circle,Square大概Triangle的句柄,并将其作为返回范例Shape发给办法.所以无论什么时刻调用这个办法,就绝对没机会理解它的具体范例毕竟是什么,因为必定会得到一个纯真的Shape句柄.
main()包含了Shape句柄的一个数组,此中的数据通过对randShape()的调用填入.在这个时刻,我们知道自己拥有Shape,但不知除此之外任何具体的情形(编译器一样不知).但是,当我们在这个数组里步进,并为每个元素调用draw()的时刻,与各范例有关的精确行为会魔术般地发生,就象下面这个输出示例展示的那样:
Circle.draw()
Triangle.draw()
Circle.draw()
Circle.draw()
Circle.draw()
Square.draw()
Triangle.draw()
Square.draw()
Square.draw()
当然,由于多少形状是每次随机挑选的,所以每次运行都大概有差别的后果.之所以要突出形状的随机挑选,是为了让大家深化领会这一点:为了在编译的时刻发出精确的调用,编译器毋需得到任何特别的情报.对draw()的全部调用都是通过动态绑定举行的.
  以上是“在java中产生切确的行为[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 在java中产生切确的行为
  • rtti在java造型前的查抄
  • <b>如安在Java编程中操纵线程</b>
  • cookie技术在Java ME平台的操纵与实现
  • 在Java中操纵VC++组件
  • 在Java中操纵SQLite的教程
  • 在Java中读取写入XML文件(DEMO_004)
  • 在Java操纵程序中成立图象
  • 在Java中操纵Factory Method筹划情势
  • <b>在Java中操纵筹划情势之Singleton</b>
  • <b>在Java中操作UDP</b>
  • 在Java中举行事件处理的办法
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .