多态,顾名思义就是有多种形态,什么时候有多种形态呢?继承(实现)。一个子类可以在任何时候使用父类类型表示。下面看一个例子:
一个抽象类
public abstract class Person { public abstract void say(); }
两个实现类
public class Jerry extends Person { @Override public void say() { System.out.println("我是jerry"); } }
public class Tom extends Person { @Override public void say() { System.out.println("我是tom"); } }
如果现在需要把Jerry和Tom放进一个集合遍历操作
public class Client4 { public static void main(String[] args) { ArrayList<Person> people = new ArrayList<>(); people.add(new Tom()); people.add(new Jerry()); for (int i = 0; i < people.size(); i++) { //判断实例属于哪个类 instanceof 如果属于这个类或者这个类得子类的实例 就会返回true,否则返回false if (people.get(i) instanceof Tom) { Tom tom = (Tom) people.get(i); tom.say(); } else { Jerry jerry = (Jerry) people.get(i); jerry.say(); } } } }
毫无疑问这是很麻烦的,取出之后还需要判断始于哪个类再执行操作。如果person的子类太多的话 判断是一件很痛苦的事,当使用多态之后上述代码可以简化为
public class Client4 { public static void main(String[] args) { ArrayList<Person> person = new ArrayList<>(); person.add(new Tom()); person.add(new Jerry()); for (int i = 0; i < person.size(); i++) { person.get(i).say(); } } }
在这里需要注意。Peoson不是一个接口。其实这个实例只是向上转型为Person类型而已,他真实的类型为Tom,他只是在需要的时候转为超类的类型存在。在任何情况下都可以把子类转换成超类类型存在。