简介
面向对象有四个基本特性:封装、继承、抽象、多态。其中封装、继承、抽象可以看作是多态的基础,而多态可以看作是封装、继承、抽象的表现。
不同类的对象对同一方法体现出不同的功能就叫做多态。
示例:
接口:定义具有共同方法的接口
public Interface Person {
public void getSex();
}
实现类1:
public class Man implements Person {
public void getSex(){
System.out.println("男人");
}
}
实现类2:
public class Woman implements Person {
public void getSex(){
System.out.println("女人");
}
}
测试类:
public static void main(String[] args) {
Person person = new Man();
person.getSex();
person = new Woman();
person.getSex();
}
控制台输出结果:
男人
女人
多态的必要条件
多态的存在,主要是解耦的作用,对于现在使用的23中设计模式来说,大部分都是基于多态的。
多态的实现,必须遵守一些条件,如下:
1. 有继承关系
2. 子类重写父类方法
3. 父类引用指向子类对象
注意:子类要能重写父类方法,其方法不能被下面几个关键字所修饰:
1. static 修饰,其方法属于类,不属于实例
2. final 修饰,被其修饰的方法不能被子类重写
3. private 修饰,被其修饰的方法,对子类不可见
protected 修饰,只局限于对子类使用,而该子类不能被外部调用,严格来说,不能完全符合多态的特性
多态的分类
1. 编译时多态,即方法的重载,这是一种静态分派
2. 运行时多态,即方法的重写,这是一种动态分派
分析多态的几条原则
如果我们有一个父类Person,有一个子类Man
1. 向上转型是自动的,即Person person = new Man();是自动的,不需要强转
2. 向下转型要强转,即Man man = new Person();是无法编译通过的,必须要Man man = (Man)new Person(); 让父类知道它要转成具体哪个类
3. 父类引用指向子类对象,子类对象重写了父类方法,调用父类的方法,实际调用的是子类重写了的父类的该方法。即Person person = new Man(); person.getSex()实际上调用的是Man中的getSex()方法
参考文档:http://www.cnblogs.com/xrq730/p/4820237.html