在Java中,以下内容符合多态的特性:
方法重载
- 多个方法可以具有相同的名称,但参数列表不同(参数个数、类型或顺序不同)。在调用时,会根据传入的实际参数来决定调用哪个具体的方法。
方法重写
- 子类重写父类的方法,即子类中定义了与父类中方法签名(方法名、参数列表、返回类型)完全相同的方法。在运行时,根据对象的实际类型来决定调用哪个类的重写方法。
对象的多态性
- 父类的引用可以指向子类的对象,通过这个父类引用调用方法时,会调用子类中重写后的方法。例如: Parent p = new Child(); ,其中 Parent 是父类, Child 是子类,当调用 p 的方法时,如果 Child 类重写了该方法,就会执行 Child 类中的方法。
接口的多态性
- 一个接口可以有多个实现类,不同的实现类可以实现接口中定义的方法以不同的方式。通过接口的引用可以指向不同的实现类对象,在调用接口方法时,会根据实际指向的对象类型来执行相应实现类中的方法。
动态绑定机制
在Java中,多态的实现依赖于动态绑定机制。在程序运行时,JVM会根据对象的实际类型来决定调用哪个类的方法。具体过程如下:当通过父类引用或接口引用调用方法时,JVM首先在对象的实际类型中查找是否有重写的方法,如果有,则调用该重写方法;如果没有,则沿着继承链向上查找,直到找到该方法的实现。
注意事项
- 方法重写规则:子类重写父类方法或实现接口方法时,方法签名必须与被重写方法一致,返回值类型可以是被重写方法返回值类型的子类,访问修饰符不能比父类中被重写方法的访问修饰符更严格。
- 对象转型问题:将子类对象赋值给父类引用后,若要将父类引用强制转换回子类类型,需确保引用实际指向子类对象,否则会抛出 ClassCastException 异常。
- 静态方法与多态无关:静态方法不能被重写,通过父类引用调用静态方法时,执行的是父类的静态方法,不体现多态性。
- 私有方法不参与多态:私有方法不能被重写,子类无法访问父类私有方法,不参与多态传递。
- 构造方法无多态性:构造方法不能被继承和重写,创建对象时根据实际创建的对象类型调用相应类的构造方法,与引用类型无关。
不管是对象还是接口,若遇到特殊方法时,都要将其转换成子类类型再访问方法