Java多态

多态,顾名思义就是有多种形态,什么时候有多种形态呢?继承(实现)。一个子类可以在任何时候使用父类类型表示。下面看一个例子:

一个抽象类
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,他只是在需要的时候转为超类的类型存在。在任何情况下都可以把子类转换成超类类型存在。


不和别人一样,不复制只真正理解
原文地址:https://www.cnblogs.com/Vinlen/p/12750771.html