多态是java运行时根据实际对象类型决定调用哪个方法的机制,需同时满足继承、方法重写、向上转型三个条件;仅适用于非static、非private、非final的实例方法,字段和静态方法无多态。
多态不是语法糖,也不是“写起来高级”的装饰,它是 Java 运行时根据实际对象类型决定调用哪个方法的机制——前提是满足继承 + 方法重写 + 向上转型这三个条件。
多态成立的三个必要条件
缺一不可,少一个就只是普通调用:
- 有继承关系(
class Dog extends Animal)或实现接口(class Dog implements Pet) - 子类重写了父类的非
private、非static、非final方法(@Override修饰的void speak()) - 使用父类/接口类型声明引用,但指向子类对象(
Animal a = new Dog();)
如果写成 Dog d = new Dog(); d.speak();,哪怕方法被重写,也不算多态——这是静态绑定,编译期就确定了。
多态只适用于实例方法,不适用于字段和静态方法
字段访问看的是引用类型,不是实际对象类型;静态方法绑定在编译期,跟对象实例无关。这两个是新手最容易误以为“也有多态”的地方: