1 接口 和 实现接口并覆盖接口中同一方法的几不同的类体现的
2 父类 和 继承父类并覆盖父类中同一方法的几个不同子类实现的.
多态有两种表现形式:方法的重载和类的重写(覆写)
首先说重载(overload),是发生在同一类中。与什么父类子类、继承毫无关系。
标识一个函数除了函数名外,还有函数的参数(个数和类型)。也就是说,一个类中可以有两个或更多的函数,叫同一个名字而他们的参数不同。
他们之间毫无关系,是不同的函数,只是可能他们的功能类似,所以才命名一样,增加可读性,仅此而已!
再说重写/覆盖(override),是发生在子类中!也就是说必须有继承的情况下才有覆盖发生(动态绑定)。
我们知道继承一个类,也就有了父类了全部方法,如果你感到哪个方法不爽,功能要变,那就把那个函数在子类中重新实现一遍。
这样再调用这个方法的时候,就是执行子类中的过程了。父类中的函数就被覆盖了。(当然,覆盖的时候函数名和参数要和父类中完全一样,不然你的方法对父类中的方法就不起任何作用,因为两者是两个函数,毫不关系)
多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象
多态的作用浓缩成一句话的话,应该就是降低代码耦合度了。
接口的体现,在Android中随处可见的匿名内部类就有描述。
父子类的体现:
public class test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Parent parent = new Child();
parent.print();
Parent parent2 = new ChildTwo();
parent2.print();
}
public static class Parent {
public void print() {
System.out.println("Parent");
};
}
public static class Child extends Parent {
public void print() {
System.out.println("Child");
}
}
public static class ChildTwo extends Parent {
public void print() {
System.out.println("ChildTwo");
}
}
}
main函数中打印结果为:
Child
ChildTwo
说明通过Parent子类的实例对象赋予Parent类的引用。此引用通过不同的子类对象,执行其覆写父类方法的具体实现,从而体现了类的多态性。
这种动态绑定的好处是扩展性很好,例如玩过网游的话应该知道 游戏中有不同的角色,它们都有一个父类,它们做相同动作时表现出来的效果就会不一样,比如跑,魔法师的跑跟战士的跑就不会一样,这就是俩者都覆盖了父类中的跑方法,各自有自己的现实,表现出来多态。如果有一天你想再加个角色,只用再写一个类继承该父类,覆盖其中的跑方法就行了,其他代码不用怎么改,所以可维护性也很好。