【Java】多态性【主线学习笔记】

文章目录

  • 前言
  • 多态性
    • 1、编译时多态性(静态多态性):
    • 2、运行时多态性(动态多态性)
    • 3、多态性的实用性
    • 4、多态性的优点与弊端
  • 下一篇
    • 点击跳转《【Java】多态性-向下转型【主线学习笔记】》


前言

Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架和实践技巧等,分享学习心得,对自己学习过程进行整理和总结,也希望能为其他学习Java的朋友提供一些帮助和参考。


多态性

在 Java 中,多态性是一种面向对象编程的特性,允许同一个方法或对象在不同的上下文中表现出不同的行为。多态性通过方法重写(Override)和方法重载(Overload)来实现,可以使代码调用更加灵活和可扩展。

1、编译时多态性(静态多态性):

方法重载是指同一个类中可以有多个同名的方法,但参数类型或参数数量不同。编译器会在编译时根据方法的参数来决定调用哪个方法。

class Example {
    void display(int a) {
        System.out.println("整数: " + a);
    }

    void display(String a) {
        System.out.println("字符串: " + a);
    }
}

public class Test {
    public static void main(String[] args) {
        Example obj = new Example();
        obj.display(10);  // 输出:整数: 10
        obj.display("Hello");  // 输出:字符串: Hello
    }
}

2、运行时多态性(动态多态性)

方法重写是指子类提供了父类方法的具体实现。在运行时,Java会根据实际对象的类型来调用对应的方法,这就是动态多态性。运行时多态性是通过继承和方法重写来实现的,它使得程序能够根据实际对象的类型来执行相应的行为。

// 父类 BankCard,代表通用的银行卡
class BankCard {
    // 模拟刷卡方法
    void swipe() {
        System.out.println("使用银行卡刷卡");
    }
}

// 子类 CreditCard,代表信用卡
class CreditCard extends BankCard {
    @Override
    void swipe() {
        System.out.println("使用信用卡刷卡并提供信用额度");
    }
}

// 子类 DebitCard,代表借记卡
class DebitCard extends BankCard {
    @Override
    void swipe() {
        System.out.println("使用借记卡刷卡并扣除账户余额");
    }
    void shape(){
        System.out.println("这是一个长方形的卡");
    }
}

// 消费类,模拟支付场景
class PaymentProcessor {
    // 动态多态性体现在这里,使用父类 BankCard 作为参数
    public void processPayment(BankCard card) {
        card.swipe();  // 调用的是具体卡片对象的 swipe() 方法
    }
}

// 测试类
public class TestPolymorphism {
    public static void main(String[] args) {
        PaymentProcessor processor = new PaymentProcessor();

        // 使用信用卡进行支付
        processor.processPayment(new CreditCard());  // 输出:使用信用卡刷卡并提供信用额度

        // 使用借记卡进行支付
        processor.processPayment(new DebitCard());  // 输出:使用借记卡刷卡并扣除账户余额
    }
}


3、多态性的实用性

适用于方法,不适用于属性。

4、多态性的优点与弊端

  • 优点:在软件系统的各种组件中,如模块、类、功能等,应该在不修改现有代码的基础上,引入新功能。极大的减少了代码的冗余,不需要定义多个重载的方法。
  • 弊端:不能直接调用Man中的特有属性和方法。例如上面的银行卡案例,在消费类模拟支付场景的类中,是无法使用card.shape()这一方法,因为声明为父类的引用,所以你无法预先判断传进来的card是子类借记卡还是信用卡又或者是父类银行卡类别。

下一篇

点击跳转《【Java】多态性-向下转型【主线学习笔记】》

你可能感兴趣的:(新手java笔记,java,学习,笔记)