1. 在面向对象中,多态是继数据抽象和继承的第三种基本特征。那什么是多态呢,又是如何实现呢?我们只要把握好多态将接口和实现分离开来,也就是分离了做什么和怎么做。
2. Java中通过实现动态绑定实现多态。
假设我们有一个Book的类,继承Book的两个子类Book1、Book2,我们有一个方法需要接收两个子类作为参数,这时候,多态允许我们直接接收基类作为参数。然而我们却无法得知传进来的参数究竟是哪个类。面向过程中例如C,C中只有一种调用,即仅使用前期绑定,但是前期绑定仍然不能确定。Java中除了static和final方法外所有的方法使用的都是后期绑定(动态绑定或者运行时绑定),即存在一种机制,使得在方法运行时根据对象的类型进行绑定。编译器一直不知道对象的类型,但是可以通过某种方法找到正确的方法体。这样的话,我们就可以放心的同基类打交道。
例如:
class Shape{
public void draw(print("Shape.draw()")){}
public void erase(){}
}
class Circle extends Shape {
public void draw(print("Circle.draw()")){}
}
Shape s= new Circle();
s.draw();
//output
Circle.draw()
这告诉我们new的对象已经绑定了draw方法,调用的子类方法而非Shape方法。
而我们要注意的是:
(1) private方法是不可被重载的,在这里若Shape中draw()为private方法,那么结果将为
//output
Shape.draw()
(2)域和静态方法,例如Shape、Circle中分别增加public int num = 0;public int num = 1;则按照以上调用添加输出num,我们会发现num=0;这就是子类和基类分别形成了不同的num域,这里Circle.num和Shape.num分配了不同的存储空间,这就相当于s拥有两个num的域,而这里默认的是Circle.num。
静态方法与类而并非单个对象相关联的,不具有多态性。