• JavaSE17——面向对象_多态


    多态

    1 什么是多态

    所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

    多态的概述如下:

    1. 对象的多态性:多态性是面向对象编程的核心思想之一。它使得具有继承关系的类的对象拥有了不同的表现形式,同一个方法可以根据对象的实际类型来调用不同的实现。
    2. 父类引用指向子类对象:多态性的核心在于使用父类的引用变量来引用子类的对象。通过这种方式,可以实现对子类对象的访问和操作。
    3. 方法的重写(覆盖):多态实现的基础是子类对父类方法的重写。当子类重写了父类的方法时,无论使用父类的引用还是子类的引用,都会调用子类重写后的方法。
    4. 运行时绑定:多态性的另一个重要特征是运行时绑定。即在程序运行时,根据对象的实际类型来动态确定调用哪个方法,而不是在编译时确定。
    5. 提高代码的灵活性和扩展性:多态性使得程序可以统一处理不同类型的对象,提高了代码的灵活性和可扩展性。通过修改或增加子类,不需要修改已有的代码,就可以实现新的功能。

    Java世界:多态是指两个或多个属 于不同类的对象,对于同一个消息(方法调用)作出不同响应的方式。

    2 实现多态的条件

    1、父类型引用指向子类型对象:可以使用父类或接口类型的引用变量来引用子类或实现类的对象。同时这句话就是多态的主要核心

    2、方法重写:子类可以根据自己的需求重写父类的方法。重写的方法在运行时将根据对象的实际类型来确定调用哪个方法。

    3 运行时和编译时多态

    运行时多态和编译时多态是多态性的两种不同表现形式。

    • 编译时多态(静态多态): 编译时多态是指在编译阶段确定调用哪个方法。在编译时,编译器根据引用变量声明的类型来决定可以调用的方法,而不考虑实际对象的类型。这是由于方法的重载(Overload)特性决定的。

    例如,假设有一个父类Animal和其子类Dog和Cat,它们都有一个名为"makeSound"的方法。当使用Animal类的引用变量调用"makeSound"方法时,在编译时编译器会根据Animal类中的方法来决定调用哪个方法。这时无论引用变量实际引用的是Dog对象还是Cat对象,都只能调用Animal类中的"makeSound"方法。

    编译时多态早绑定(Early Binding)也被称为静态多态,因为调用的方法在编译时已经确定下来,与实际运行时的对象类型无关。

    • 运行时多态(动态多态): 运行时多态是指在程序运行时根据实际对象的类型来决定调用哪个方法。这是由于方法的重写(Override)特性决定的。

    当使用父类的引用变量指向子类的对象,并调用重写了的方法时,会在运行时根据实际对象的类型来动态决定调用哪个方法。通过动态绑定,可以实现不同对象的不同行为。

    例如,在上述的例子中,如果将Animal类的引用变量指向Dog对象,然后调用"makeSound"方法,此时会调用Dog类中重写的"makeSound"方法,而不是Animal类中的方法。这是因为在运行时,会根据实际对象的类型来确定调用的方法。

    运行时多态也被称为晚绑定(Late Binding)或动态绑定,因为调用的方法在运行时才确定,与编译时的类型声明无关。

    4 案例演示

    class Animal {
        public void sound() {
            System.out.println("Animal makes a sound.");
        }
    }
    
    class Dog extends Animal {
        public void sound() {
            System.out.println("Dog barks.");
        }
    }
    
    class Cat extends Animal {
        public void sound() {
            System.out.println("Cat meows.");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Animal animal1 = new Dog();
            Animal animal2 = new Cat();
            
            animal1.sound();  // 输出:Dog barks.
            animal2.sound();  // 输出:Cat meows.
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在上面的示例中,Animal类是一个基类,它有一个sound()方法。Dog类和Cat类是Animal类的子类,它们分别重写了sound()方法。在主函数中,通过使用基类Animal的引用指向子类对象,实现了多态性。调用sound()方法时,根据对象的实际类型来确定调用的方法。

    5 多态的优点

    多态在实际应用中的一些优点包括:

    • 代码复用:通过多态性,可以使用父类的引用变量来操作不同子类的对象,减少重复代码的编写。
    • 简化代码:通过多态性,可以简化代码的逻辑和结构,提高代码的可读性和维护性。
    • 扩展性:通过增加子类,可以方便地扩展程序的功能,而不影响原有的代码。

    6 总结

    1、多态性基于继承和方法重写:通过继承,子类可以继承父类的属性和方法,并且可以根据需要重写父类的方法。这样,通过父类引用指向子类对象时,可以根据对象的实际类型来调用适当的方法。

    2、父类引用指向子类对象:通过父类或接口类型的引用变量,可以引用子类或实现类的对象。这样做的好处是可以统一处理不同类型的对象,提高代码的灵活性和可复用性。

    3、编译时类型和运行时类型:多态性的关键在于运行时的动态绑定。编译时,编译器只知道引用变量的类型是父类或接口,而不知道实际引用的对象类型。运行时,根据实际对象的类型来确定调用哪个方法,这就是动态绑定。

    4、多态性提高了代码的可扩展性和可维护性:通过多态性,可以方便地扩展程序,添加新的子类或实现类,并且无需修改现有的代码。这样可以减少代码的耦合性,提高代码的可维护性和可重用性。

    5、多态性的应用场景:多态性广泛应用于面向对象的设计和编程中,特别是在设计模式、接口和抽象类的使用中。它使得代码更加灵活、可扩展,并且能够更好地应对变化和需求的变动。

    总之,多态性是面向对象编程中的重要概念,通过继承和方法重写实现,可以让程序更加灵活、可扩展,并提高代码的可维护性和可重用性。合理运用多态性的特性,可以写出更优雅、高效的代码。

  • 相关阅读:
    python_爬虫
    状压dp:Gym - 102832J
    重构代码用warning提醒调用者API发生变化
    37手游云平台基于Flink+Hologres大数据建设实践
    6. React.Component 和 React.PureComponent 的区别?
    4.1 一个简单的Linux Kernel模块
    前端基础:BFC
    空域变换-直方图局部处理(CLAHE)
    解数独 视频讲解 c++
    流程图渲染方式:Canvas vs SVG
  • 原文地址:https://blog.csdn.net/tonyshi1989/article/details/133352046