JAVA的多态

简单来说,多态就是事物在运行过程中存在不同的状态。多态的存在有三个前提:要有继承关系、子类要重写父类的方法、父类要引用指向子类对象(比如 Parent p = new Child();也称为向上转型)

关于继承和重写,之前已经说过了,主要先来谈一下这个向上转型。以上一段那句代码为例,向上转型就是指父类(Parent)引用(=)指向子类对象(通过new实例化的Child()),简单来说就是将子类的对象转为父类对象,这样做的结果,就是如果父类和子类都有一个talk方法,那么我这个p调用talk方法的时候是调用子类的talk方法,可是如果子类有一个sleep方法是父类没有的,p就不能调用了。

为什么要搞这么复杂,还是先从一个例子入手,假如我们现在有一个human父类,有两个子类man和woman,然后它们都有一个sleep和eat方法,不过子类重写了这两个方法,父类有一个information方法(里面会调用eat方法和sleep方法)。假如现在我们想要显示男人a和b、女人c的一些信息(即调用information方法),如果还没有学习多态,我们就需要实例化男人ab和女人c,再每个调用它们的sleep和eat方法(或者为每个子类都写一个information方法,如果子类很多那就是一个灾难了),现在有了多态,代码就能简化了,只要直接调用父类的information方法(information(new man()),这就是向上转型的过程),然后父类的information方法会根据实例化的是man还是woman,调用它们已经重写了的eat和sleep方法,这样,就能大大减少了代码的重复。

说到了向上转型,就顺便再介绍一下向下转型。向上转型有一个缺点,那就是子类对象不能调用它独特的方法,只能调用父类子类都有的方法。如果我们既希望向上转型,又可以使得子类调用它的方法,就需要向下转型了。

向下转型是在向上转型的基础上进行的,比如一开始的向上转型Parent p = new Child(),如果我们希望进一步向下转型,可以运行以下代码Child c = (Child) p,它有点像强行转换类型的代码,经过乡下转型之后,就可以调用子类的所有方法了。

参考资料
[1] https://blog.csdn.net/TNTZS666/article/details/80273986