多态
概述
我们都知道面向对象有四个基本特性:抽象、封装、继承、多态。这四个特性,概括起来可以这么理解,抽象、封装、继承是多态的基础,多态是抽象、封装、继承的表现。多态,是Java中非常重要的一个部分,所以今天来谈一下多态(Polymorphism)。
什么是多态
多态就是同一个行为具有不同表现形式或形态的能力。就像上课铃响了,上体育课的学生跑到操场上站好,上语文课的学生在教室里坐好一样。
多态存在的三个条件
1、有继承关系
2、子类重写父类方法
3、父类引用指向子类对象
补充一下第二点,既然多态存在必须要有“子类重写父类方法”这一条件,那么以下三种类型的方法是没有办法表现出多态特性的(因为不能被重写):
1、static方法,因为被static修饰的方法是属于类的,而不是属于实例的
2、final方法,因为被final修饰的方法无法被子类重写
3、private方法和protected方法,前者是因为被private修饰的方法对子类不可见,后者是因为尽管被protected修饰的方法可以被子类见到,也可以被子类重写,但是它是无法被外部所引用的,一个不能被外部引用的方法,怎么能谈多态呢
多态的分类
1、编译时多态,即方法的重载(方法名相同,参数列表不同),从JVM的角度来讲,这是一种静态分派(static dispatch)
2、运行时多态,即方法的重写,从JVM的角度来讲,这是一种动态分派(dynamic dispatch)
分析多态问题的几条原则
如果不去理解多态的原理,就从使用的角度来讲,以个人的学习、工作这几年的经验,总结出了多态无非就是三句话:
比如我们有一个父类Father,有一个子类Children
1、向上转型是自动的。即Father f = new Children()是自动的,不需要强转
2、向下转型要强转。即Children c = new Father()是无法编译通过的,必须要Children c = (Children)new Father(),让父类知道它要转成具体哪个子类
3、父类引用指向子类对象,子类重写了父类的方法,调用父类的方法,实际调用的是子类重写了的父类的该方法。即Father f = new Children(),f.toString()实际上调用的是Children中的toString()方法
重写与重载之间的区别
| 区别点 | 重载方法 | 重写方法 |
|---|---|---|
| 参数列表 | 必须修改 | 一定不能修改 |
| 返回类型 | 可以修改 | 一定不能修改 |
| 异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
| 访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
本文深入解析Java中的多态概念,探讨其三个必备条件,包括继承关系、子类重写父类方法及父类引用指向子类对象。文章还区分了编译时与运行时多态,并总结了多态应用的三条基本原则。
349

被折叠的 条评论
为什么被折叠?



