Java 中的方法重写2025年9月5日 | 阅读11分钟 如果子类(派生类)拥有与父类中声明的相同的方法,这在 Java 中称为方法重写。 换句话说,如果子类为父类中声明的一个方法提供了特定的实现,这就称为方法重写。 Java 方法重写的用法
Java 方法重写规则
不使用方法重写理解问题让我们了解一下在程序中不使用方法重写可能会遇到的问题。 示例编译并运行输出 Vehicle is running 说明 我们创建一个 Bike 类的实例,并使用它来调用 Bike 类中的 run() 方法。由于 Bike 继承自 Vehicle,Vehicle 类中的 run() 函数在 Bike 类中被重写,因此在 Bike 对象上使用该方法时会打印“Vehicle is running”。这表明了方法重写,其中子类中指定的方法会重写具有相同签名的超类中的方法,从而产生多态行为。 方法重写示例在此示例中,我们在子类 Bike 中定义了 run() 方法,并且父类 Vehicle 中也定义了相同的方法,但它有一些特定的实现。方法的名称和参数相同,并且类之间存在 IS-A 关系,因此存在方法重写。 示例编译并运行输出 Bike is running safely 说明 这个 Java 程序演示了一个子类(Bike)中的方法重写了其超类(Vehicle)中的同一方法。在此示例中,run() 方法由两种类型共享,但 Bike 类对其进行了不同的实现,输出“Bike is running safely.”。当我们创建 Bike 的实例并对其使用 run() 方法时,Bike 类中被重写的方法会被执行,这证明了子类的实现优先于超类的实现。它展示了 Java 的动态多态性功能如何使具有相同签名的不同类中的方法表现出不同的行为,即使它们属于同一个继承树。 Java 方法重写的实际示例考虑一种情况,其中 Bank 是一个类,它提供了获取利率的功能。但是,利率因银行而异。例如,SBI、ICICI 和 AXIS 银行的利率可能分别为 8%、7% 和 9%。 ![]() 示例编译并运行输出 SBI Rate of Interest: 8 ICICI Rate of Interest: 7 AXIS Rate of Interest: 9 说明 这个 Java 程序使用了一个真实场景,其中三个类 — SBI、ICICI 和 AXIS — 重写了它们父类 Bank 的一个方法,以演示方法重写的概念。Bank 类的 getRateOfInterest() 方法返回 0。每个子类都通过自己的实现重写了这个方法:SBI 返回 8,ICICI 返回 7,AXIS 返回 9。Test2 类中创建了每个子类对象,然后使用每个对象的 getRateOfInterest() 方法来打印出每个银行相应的利率。这说明了方法重写如何实现依赖于运行时对象类型的多态行为,从而使每个子类都能提供对从超类继承的方法的自己的实现。 我们可以重写 static 方法吗?不,在 Java 中不能重写 static 方法。当子类定义了一个与超类中的 static 方法具有相同签名的 static 方法时,它只是隐藏了超类方法,而不是重写它。这意味着调用的方法是在编译时根据引用类型确定的,而不是在运行时根据对象的类型确定的。因此,static 方法不像实例方法那样表现出多态行为。 为什么我们不能重写 static 方法?由于 Java 中的 static 方法与类本身而不是类的任何特定实例相关联,因此我们无法重写它们。Java 的动态分派机制,它在运行时根据对象的实际类型确定要调用的方法,是方法重写的基础。 由于 static 方法不是动态分派的,它们是在编译时根据引用类型解析的,并且属于类,因此不能像实例方法那样重写 static 方法。 此外,虽然实例方法存储在对象的堆区域中,并且特定于类的每个实例,但 static 方法存储在 JVM 内存的方法区中,该区域被类的所有实例共享。由于实例方法和 static 方法在行为和内存分配上的基本差异,因此不能修改 static 方法。 我们可以重写 Java main() 方法吗?不,因为 Java main() 方法被声明为 static,所以我们无法重写它。Java 中的 main 函数被声明为 public static void main(String[] args),并作为程序的入口点。 如 static 关键字所示,所讨论的方法属于类本身,而不是类的任何特定实例。 由于 static 方法不能被重写,因此无法在子类中重写 main 方法。作为执行的起点,每个 Java 程序都必须包含一个具有必需签名的 main 方法。 方法重载与方法重写
Java 访问修饰符与方法重写如果您正在重写任何方法,被重写的方法(即在子类中声明的)**不得更严格**。 Simple.java 输出 ![]() 说明 类 A 在提供的 Java 代码中声明了一个名为 msg() 的方法,其访问修饰符为 protected。通过扩展类 A,类 Simple 试图用默认访问修饰符替换 message() 函数。但是,由于默认访问修饰符比 protected 更严格,这会导致编译时错误。在 Java 中重写方法时,子类中被重写方法的访问级别需要与超类中方法的访问级别一样宽松(或更宽松)。因此,为了修复该问题,类 Simple 方法的访问修饰符 — 例如 protected 或 public — 应该与 protected 一样宽松,或者类 A 方法应该具有不太严格的访问修饰符 — 例如 default 或 public。 结论在 Java 中,方法重写对于创建运行时多态和促进程序模块化和可重用性至关重要。子类通过提供其超类中声明的方法的特定实现来改进代码库的灵活性和适应性。通过允许子类修改继承方法的行为以适应其独特的需要,方法重写鼓励更模块化和可维护的设计。但是,重写方法存在限制,例如不能重写 static 方法以及必须遵循访问修饰符的限制。这些限制是继承和封装的体现,是 Java 语言设计的一部分。 总之,Java 的方法重写功能允许子类提供继承方法的自定义实现,使程序员能够编写更灵活、模块化和易于维护的代码。通过严格遵守方法重写准则和最佳实践,开发人员可以充分利用面向对象编程概念的优势,创建可靠且可扩展的软件系统。 Java 方法重写选择题1. 在 Java 中,在重写的方法中调用超类方法的正确方法是什么?
答案:a) 解释:要调用重写方法中的超类方法,请使用 super 关键字后跟方法名。它允许子类调用其超类的实现。 2. 如果子类重写了其超类的方法,当在子类类型的对象上调用该方法时,哪个方法会被调用?
答案:b) 解释:当子类重写一个方法时,在子类类型的对象上调用该方法时,会调用子类版本的该方法。这是 Java 中多态性的核心方面。 3. 哪个注解通常用于指示一个方法正在重写其超类中的方法?
答案:a) 解释:@Override 注解表示一个方法正在重写其超类中的方法。如果该方法未能正确重写超类中的任何方法,它有助于检测错误。 4. Java 中的 private 方法可以被重写吗?
答案:b) 解释:在 Java 中不能重写 private 方法,因为子类无法访问它们。它们被限制在它们定义的类中。 5. 以下关于 Java 方法重写的说法哪一项是正确的?
答案:d) 解释:重写方法的访问级别可以不那么严格,但不能比它重写的方法更严格。它必须具有相同的返回类型或子类型(协变返回类型),并且可以抛出更少或更具体的异常。 下一主题Java 中的协变返回类型 |
我们请求您订阅我们的新闻通讯以获取最新更新。