笔友城堡 - 可定义的个人主页

前言

多态就是类的同一行为,在不同对象上有不同的实现方式,这个也是Java面试中最常被问的。面向对象三大特性有封装继承、多态。

下面重点关注一下多态,记录于此,方便自己查阅。

正文

什么是多态

父类引用指向子类对象,调用方法时执行的是子类的方法。

Animal a = new Dog();
a.speak(); // 输出:汪汪

虽然变量类型是Animal,但实际执行的是Dog的行为。

同一行为,在不同对象上有不同的实现方式

多态的必要条件

  1. 继承(或实现接口)

  2. 方法重写(Override)

  3. 父类引用指向子类对象

缺一不可。

多态的表现

  1. 方法重写

    class Animal {
        void speak() {
            System.out.println("动物叫");
        }
    }
    
    class Dog extends Animal {
        @Override
        void speak() {
            System.out.println("汪汪");
        }
    }
    
    //调用
    Animal a = new Dog();
    a.speak(); // 汪汪
  2. 接口多态

    interface Payment {
        void pay();
    }
    
    class WeChatPay implements Payment {
        public void pay() {
            System.out.println("微信支付");
        }
    }
    
    class AliPay implements Payment {
        public void pay() {
            System.out.println("支付宝支付");
        }
    }
    
    //调用
    Payment p = new WeChatPay();
    p.pay();

向上转型 & 向下转型

  1. 向上转型

    Animal a = new Dog(); // 安全
  1. 向下转型(强制)

    Dog d = (Dog) a;

若类型不匹配会抛异常:

Cat c = (Cat) a; // ClassCastException

多态的优点

降低耦合
void pay(Payment p) {
    p.pay();
}

新增支付方式无需改代码。

提高扩展性
  • 对扩展开放

  • 对修改关闭

开闭原则

代码更通用
List<String> list = new ArrayList<>();

面向接口编程,而不是具体实现。

多态 vs 重载

对比点多态(Override)重载(Overload)
发生时机运行期编译期
方法签名相同不同
绑定方式动态绑定静态绑定
是否属于多态✅ 是❌ 不算真正的多态

面试总结

多态的好处?

提高代码扩展性、可维护性,降低模块间耦合,是面向对象设计的核心思想。

Java如何实现多态?

依靠 继承 / 接口 + 方法重写 + 父类引用指向子类对象 + JVM 动态绑定。

构造方法可以是多态的吗?

❌ 不可以

构造方法不能被继承,也不能被重写

总结

Java 多态 = 父类引用指向子类对象 + 运行时动态绑定方法,是解耦和扩展的关键。

参考文章

AI

相关网址

笔友城堡 - 可定义的个人主页

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...