日期: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(),因为后期绑定已经参与(多形性).
下面这个例子从一个略微差别的角度阐明了问题:
针对从Shape衍生出来的全部东西,Shape成立了一个通用接口——也就是说,全部(多少)形状都可以描绘和删除.衍生类覆盖了这些定义,为每种特别范例的多少形状都供应了举世无双的行为.//: 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(); } } ///:~
在主类Shapes里,包含了一个static办法,名为randShape().它的作用是在每次调用它时为某个随机挑选的Shape对象生成一个句柄.请注意上溯造型是在每个return语句里发生的.这个语句获得指向一个Circle,Square大概Triangle的句柄,并将其作为返回范例Shape发给办法.所以无论什么时刻调用这个办法,就绝对没机会理解它的具体范例毕竟是什么,因为必定会得到一个纯真的Shape句柄.
main()包含了Shape句柄的一个数组,此中的数据通过对randShape()的调用填入.在这个时刻,我们知道自己拥有Shape,但不知除此之外任何具体的情形(编译器一样不知).但是,当我们在这个数组里步进,并为每个元素调用draw()的时刻,与各范例有关的精确行为会魔术般地发生,就象下面这个输出示例展示的那样:
当然,由于多少形状是每次随机挑选的,所以每次运行都大概有差别的后果.之所以要突出形状的随机挑选,是为了让大家深化领会这一点:为了在编译的时刻发出精确的调用,编译器毋需得到任何特别的情报.对draw()的全部调用都是通过动态绑定举行的.Circle.draw() Triangle.draw() Circle.draw() Circle.draw() Circle.draw() Square.draw() Triangle.draw() Square.draw() Square.draw()
以上是“在java中产生切确的行为[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:java的扩大性
- ·下一篇文章:java办法调用的绑定
- ·中查找“在java中产生切确的行为”更多相关内容
- ·中查找“在java中产生切确的行为”更多相关内容
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论