📜  什么时候需要防止Java的方法覆盖?

📅  最后修改于: 2022-05-13 01:54:30.771000             🧑  作者: Mango

什么时候需要防止Java的方法覆盖?

在这里,我们将讨论为什么要防止Java的方法覆盖。因此,在进入主题之前,让我们先看看以下重要概念,然后我们将进入实际主题。众所周知,面向对象编程 (OOP) 概念由 4 个重要概念组成,如下所示:

  1. 封装
  2. 遗产
  3. 多态性
  4. 抽象

多态性是4个支柱糟糕的是指执行以不同的方式在单个动作中的重要支柱一张。这意味着对象在不同条件下的行为不同。它分为2种主要类型,即

  1. 编译时多态或静态多态或早期绑定。
    • 示例:方法重载
  2. 运行时多态性或动态多态性或后期绑定。
    • 示例:方法覆盖

方法重载和方法覆盖也有一些区别。在项目中实际工作时,会出现一些情况,我们需要实现重载或覆盖,以及在某些情况下我们需要防止重载和覆盖。由于我们的主题旨在关注“为什么我们应该防止方法覆盖?”让我们转到那部分。在任何项目中工作时,我们都避免以不同方式覆盖方法,主要是出于以下列出和进一步讨论的两个原因:

  1. 性能参数
  2. 设计决策

让我们通过深入了解它们来讨论并实施它们。

原因一:性能参数



在覆盖 JVM 时,会在运行时执行额外的操作,这会影响性能。是的,它是方法绑定,这意味着将在运行时根据引用指向的实际对象决定调用方法,因此需要额外的时间,而在编译期间的静态绑定中,决定调用哪个方法(函数调用与适当的方法)。因此,很明显,我们正在防止覆盖意味着我们正在防止运行时绑定,我们正在防止运行时绑定意味着我们正在节省时间并提高性能。因此,有时我们会阻止覆盖以提高软件应用程序的性能。

原因 2:设计决策

在许多场景/情况下,我们不想通过派生类更改特定基类方法的行为。这意味着我们希望保持父类方法的原样,而不会被其子类更改。

执行:

我们有一个基类 Car 和一个派生类 Skoda Car,其中基类有 3 个方法,如下所示:

  • 速度()
  • 健康)状况()
  • 维护()

这里我们希望speed()方法保持不变,另外两个方法condition()方法和maintenance()方法要改变(指派生类中提供的主体)。正如下面的例子所讨论的那样。

例子

Java
// Java Program to illustatte Prevention method overriding
  
// Importing input output classes
import java.io.*;
  
// Class 1
// Base class
class Car {
  
    // We do not want spped to be changed change in base
    // class, so we will not provide any body to speed()
    // method in derived class So we will provide new body
    // to condition() method and maintenance() method in
    // derived class
  
    // Methods of this class
    public final void speed()
    {
  
        // Print statement
        System.out.println("Maximum speed allowed");
    }
    public void condition()
    {
        // Print statement
        System.out.println("good");
    }
    public void maintenance()
    {
        // Print statement
        System.out.println("required");
    }
}
  
// Class 2
// Derived class
class Skoda_Car extends Car {
    public void condition()
    {
  
        // Print statement
        System.out.println("Car condition good");
    }
  
    public void maintenance()
    {
  
        // Print statement
        System.out.println("Maintenance not required");
    }
}
  
// Class 3
// Main class
class Main {
  
    // Main drive method
    public static void main(String[] args)
    {
  
        // Here Parent class reference refers to
        // a Child object so child class methods will be
        // called This is known as run -time polymorphism
  
        // Creating an object of child class in Main class
        Skoda_Car c = new Skoda_Car();
  
        // Calling methods in Base class over object created
        // above
        c.speed();
        c.condition();
        c.maintenance();
    }
}


输出
Maximum speed allowed
Car condition good
Maintenance not required