在这里,我们将讨论为什么要防止在 java 中覆盖方法。因此,在进入主题之前,让我们看一下下面的重要概念,然后我们将进入实际主题。正如我们所知,面向对象编程 (OOP) 概念由以下 4 个重要概念组成:
封装
继承
多态性
抽象
多态是 Oops 的 4 个支柱中的重要支柱之一,Oops 是指以不同的方式执行单个操作。这意味着对象在不同条件下的行为不同。它分为两种主要类型,即
编译时多态性或静态多态性或早期绑定。
示例:方法重载
运行时多态性或动态多态性或后期绑定。
示例:方法覆盖
方法重载和方法覆盖之间也有一些区别。在项目中实际工作时,会出现一些情况,当我们需要实现重载或覆盖时,以及在某些场景中我们需要防止重载和覆盖。由于我们的主题旨在关注“我们为什么要防止方法覆盖?”让我们转到那部分。在从事任何项目时,我们避免以不同方式覆盖方法主要有以下两个原因并进一步讨论:
性能参数
设计决策
让我们讨论并通过深入了解它们来实现它们。
原因一:性能参数
在覆盖 JVM 时,会在运行时执行额外的东西,这会影响性能。是的,它是方法绑定,这意味着将调用的方法是在运行时根据引用指向的实际对象决定的,因此需要额外的时间,而在编译时的静态绑定中,将决定调用哪个方法(函数调用与适当的方法)。因此,很明显,我们正在防止覆盖意味着我们正在防止运行时绑定,我们正在防止运行时绑定意味着我们正在节省时间并提高性能。因此,有时我们会阻止覆盖以提高软件应用程序的性能。
原因 2:设计决策
在许多场景/情况下,我们不希望通过其派生类来更改特定基类方法的行为。这意味着我们希望保持父类方法不变,并且不会被其子类更改。
实施:
我们有一个基类 Car 和一个派生类 Skoda Car,其中基类有 3 个方法,如下所示:
速度()
条件()
维护()
这里我们希望speed()方法保持不变,另外两个方法condition()方法和maintenance()方法被改变(意味着派生类中提供的body)。如下例所述。
例子
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 speed 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