“1.7 伴随多态的可互换对象”讲到了面向对象中的最重要的一个概念就是多态,单从字面如何去理解其含义呢。下面直接通过一段java代码去解释这种很厉害的技术:
voiddoSomething(Shapeshape) { shape.erase(); // ... shape.draw(); }
Circlecircle=newCircle(); Triangletriangle=newTriangle(); Lineline=newLine(); doSomething(circle); doSomething(triangle); doSomething(line);
可以把上面的doSomething(circle)方法的执行理解为多态的行为,即doSomething(Shape shape)的定义,支持继承自Shape这个基类的所有子类的类型的参数,然后有子类在doSomething这个方法里执行自己的方法逻辑。是不是很神奇?书中描述了一段向上转型的概念,你就理解为doSomathing虽然参数定义的是Shape这个基类,但是能接收他下面的任何子类,等同于任何子类都向上转型为了Shape基类了。为啥是向上,因为继承图中基类在上。其实神奇的地方不只是这点,而是其原理。文中有讲到,不要说”如果是Circle,请你这样做,如果是Square,请那样做......”,如果这样理解,会涉及到类型检查的代码编写,如果有新的子类扩展的话需要修改代码,这是不科学的。应该理解为”你是一个Shape,我知道你可以erase和draw,那么去做吧,但是请注意细节”。这段解释很神奇,如何做到的,其实是前面的一个词:后期绑定也就是动态绑定。几段原话:”当向对象发送消息时,被调用的代码直到运行时才能确定”,”为了执行后期绑定,Java使用一小段特殊的代码来替代绝对地址调用。这段代码使用在对象中存储的信息来计算方法体的地址。这样,根据这一小段代码的内容,每一个对象都可以具有不同的行为表现”。好好体会。