首页 > Java > java教程 > 正文

多态性:Java 中的解码方法重写

Mary-Kate Olsen
发布: 2024-11-02 18:14:02
原创
930 人浏览过

Polymorphism: Decoding Method Overriding in Java

方法重写是Java中多态性的核心概念之一,允许子类提供其超类中已定义的方法的特定实现。这个强大的功能有助于实现运行时多态性并启用动态方法调度。在这篇文章中,我们将深入研究基本概念、规则和现实世界的示例,以彻底理解方法重写


什么是方法重写?

当子类使用相同的方法签名(相同的名称、参数和返回类型或协变返回类型)从其超类重新定义方法时,就会发生方法重写。与在编译时解决的方法重载不同,方法重写实现了运行时多态性,其中实际调用的方法取决于对象的运行时类型。


1.方法重写规则

1。方法签名一致性:

  • 子类中的方法名称和参数列表必须与超类中的方法完全匹配。

2。返回类型和协变返回类型:

  • 返回类型必须相同或协变类型(超类中原始返回类型的子类型)。

3。访问修饰符:

  • 子类中的方法不能具有比超类中的方法更严格的访问级别(例如,如果超类方法受保护,则子类不能将其设为私有)。

公共>受保护>默认(包-私有)>私人

4。方法可见性:

  • 私有方法不能被重写。相反,如果在子类中重新定义,它们将被视为全新的方法。

示例:基本方法重写

package oops.polymorphism;

// Base class
public class MethodOverridingParent {

    // Private Methods CANNOT be overridden
    private String getName() {
        return "Hello";
    }

    // Display method to be overridden (Access Modifier: default)
    void display() {
        System.out.println("Parent Method Called");
    }

    // Return type is Number (parent class of Integer, Double, etc.)
    public Number getCount() {
        return 20;
    }
}
登录后复制
登录后复制

在MethodOverridingParent中,只有display()和getCount()可以被子类覆盖,因为它们可以在父类之外访问。然而,getName() 是私有的,因此不能被覆盖,因为它不被子类继承。


2.子类中的方法重写

package oops.polymorphism;

public class MethodOverridingChild extends MethodOverridingParent {

    // Access Level Increased; Default -> Protected
    @Override
    protected void display() {
        System.out.println("Child Method Called");
    }

    public static void main(String[] args) {

        // Calling Parent Class Method
        MethodOverridingParent parent = new MethodOverridingParent();
        parent.display(); // Output: Parent Method Called

        // Calling Child Class Overridden Method - Runtime Polymorphism
        MethodOverridingParent child = new MethodOverridingChild();
        child.display(); // Output: Child Method Called
    }
}
登录后复制

说明:由于子类 MethodOverridingChild 中重写了 display(),因此在 MethodOverridingChild 实例上调用 display() 会调用子类的版本。这是运行时多态性的实际应用。


3.协变返回类型:一个实际示例

Java 对协变返回类型的支持允许子类返回比超类的返回类型更具体的类型。这种方法遵循 SOLID 原则中的里氏替换原理,增强了代码灵活性。

package oops.polymorphism;

// Base class
public class MethodOverridingParent {

    // Private Methods CANNOT be overridden
    private String getName() {
        return "Hello";
    }

    // Display method to be overridden (Access Modifier: default)
    void display() {
        System.out.println("Parent Method Called");
    }

    // Return type is Number (parent class of Integer, Double, etc.)
    public Number getCount() {
        return 20;
    }
}
登录后复制
登录后复制

说明:在 CovariantReturnType 中,getCount() 通过返回一个 Integer(Number 的子类型)来覆盖父方法,演示了协变返回类型。该方法仍然是公共的,因为 Java 要求重写方法的访问级别不能降低。


方法重写与方法重载

  • 方法重写启用动态多态性并在继承层次结构中运行。
  • 方法重载是通过具有不同的参数类型或数字在同一类中实现静态多态性的一种形式。

何时使用方法重写

  1. 动态方法解析:重写方法在运行时根据对象类型解析,提供更大的灵活性。
  2. 扩展行为:子类可以修改或扩展超类方法的功能。

结论

通过理解和应用方法重写,我们可以构建更灵活、可重用和多态的 Java 应用程序,这些应用程序遵循面向对象编程原则。


相关帖子

  • Java 基础知识

  • 数组面试要点

  • Java 内存基础

  • Java 关键字要点

  • 集合框架要点

编码快乐!

以上是多态性:Java 中的解码方法重写的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!