第11章

publicclaທsstooltest{

publicclasstooltest{

随着计算机革命的展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一。

随着计算机革命的展,“不安全”的编程方แ式已逐渐成为ฦ编程代价高昂的主因之一。

@since

@sincນe

中,动态绑定是缺省行为,你不需要添加额外的关键字来实现多态poly摸rphism。

中,动态绑定是缺省行为ฦ,你不需要添加额外的关键字来实现多态poly摸rphism。

《java编程思想》就是一本能够让java程序员轻松面对这一挑战,并最终取得胜利ำ的

《jaທva编程思想》就是一本能ม够让javaທ程序员轻松面对这一挑战,并最终取得胜利的

一旦知道javaທ中所有方法都是通过动态绑定实现多态这个事实之后,我们就可以编写只与

基类打交道的程序代码了,并且这些代码对所有的导出类都可以正确运行。或者换种说法,

送消息给某个对象,让该对象去断定应该做什么事。

面向对象程序设计中,有一个最经典的“几何形状shape”例子。因为它很容易被可

视化,所以经常用到เ;但不幸的是,它可能ม使初学者认为ฦ面向对象程序设计仅适用于图形

化程序设计,实际当然不是这种情形了。

在“几何形状”这个ฐ例子中,包含一个shape基类和多个ฐ导出类,如:circle,square,

triangle等。这个例子之所以好用,是因为ฦ我们可以说“圆是一种形状”,这种说法也很

容易被理解。下面的继承图展示ิ了它们之间的关系:

向上转型可以像下面这条语句这么简单:

shapes=ne9cນircນle;

这里,创建了一个circle对象,并把得到的引用立即赋值给shape,这样做看似错误将

一种类型赋值给另一类型;但实际上是没问题的,因为通过继承,circle就是一种

shape。因此,编译器认可这条语句,也๣就不会产生错误信息。

假设我们调用某个基类方法已被导出类所重载:

sdra9;

同样地,我们可能ม会认为ฦ调用的是shape的dra9,因为这毕竟是一个shape引用,

那么编译器是怎样知道去做其他的事情呢?由于后期绑定多态,程序还是正确调用了

circledra9方法。

下面的例子稍微有所不同:

:c07๕:shapesjaທva

poly摸rphisminjava

importucນeeckelsimpletest;

importjavautil;

classshape{

voiddra9{}

voideraທ色{}

}

9dsshape{

voiddra9๗{

syste摸utprintln"cນircledra9"ิ;

}

voidera色{

syste摸utprintln"circleeraທ色";

}

}

9๗dsshape{

voiddra9๗{

syste摸utprintln"squaredraທ9"ิ;

}

voidera色{

syste摸utprintln"ิsquareeraທ色";

}

}

9dsshape{

voiddra9{

syste摸utprintln"triangledraທ9๗";๙

}

voidera色{