📜  Java中的方法Overriding

📅  最后修改于: 2020-09-24 03:21:29             🧑  作者: Mango

Java中的方法覆盖

如果子类(子类)具有与父类中声明的方法相同的方法,则在Java中称为方法重写。

换句话说,如果子类提供其父类之一已声明的方法的特定实现,则称为方法重写。

Java方法覆盖的用法

  • 方法重写用于提供其超类已经提供的方法的特定实现。
  • 方法覆盖用于运行时多态

Java方法覆盖规则

  • 该方法必须与父类中的名称相同
  • 该方法必须具有与父类相同的参数。
  • 必须存在IS-A关系(继承)。

在不覆盖方法的情况下理解问题

让我们了解一下,如果不使用方法重写,可能会在程序中遇到问题。

"//Java Program to demonstrate why we need method overriding  
//Here, we are calling the method of parent class with child  
//class object.  
//Creating a parent class  
class Vehicle{  
  void run(){System.out.println("Vehicle is running");}  
}  
//Creating a child class  
class Bike extends Vehicle{  
  public static void main(String args[]){  
  //creating an instance of child class  
  Bike obj = new Bike();  
  //calling the method with child class instance  
  obj.run();  
  }  
}  

输出:

问题是我必须在子类中提供run()方法的特定实现,这就是我们使用方法重写的原因。

方法覆盖的示例

在此示例中,我们已经在父类中定义了子类中的run方法,但是它具有一些特定的实现。方法的名称和参数相同,并且类之间存在IS-A关系,因此存在方法覆盖。

"//Java Program to illustrate the use of Java Method Overriding  
//Creating a parent class.  
class Vehicle{  
  //defining a method  
  void run(){System.out.println("Vehicle is running");}  
}  
//Creating a child class  
class Bike2 extends Vehicle{  
  //defining the same method as in the parent class  
  void run(){System.out.println("Bike is running safely");}  
    public static void main(String args[]){  
  Bike2 obj = new Bike2();//creating object  
  obj.run();//calling method  
  }  
}  

输出:

Java方法覆盖的真实示例

考虑一个场景,其中Bank是提供获取利率的功能的类。但是,利率因银行而异。例如,SBI,ICICI和AXIS银行可以提供8%,7%和9%的利率。

Java方法覆盖主要用于运行时多态,我们将在下一页中学习。

"//Java Program to demonstrate the real scenario of Java Method Overriding  
//where three classes are overriding the method of a parent class.  
//Creating a parent class.  
class Bank{  
int getRateOfInterest(){return 0;}  
}  
//Creating child classes.  
class SBI extends Bank{  
int getRateOfInterest(){return 8;}  
}  
  class ICICI extends Bank{  
int getRateOfInterest(){return 7;}  
}  
class AXIS extends Bank{  
int getRateOfInterest(){return 9;}  
}  
//Test class to create objects and call the methods  
class Test2{  
public static void main(String args[]){  
SBI s=new SBI();  
ICICI i=new ICICI();  
AXIS a=new AXIS();  
System.out.println("SBI Rate of Interest: "+s.getRateOfInterest());  
System.out.println("ICICI Rate of Interest: "+i.getRateOfInterest());  
System.out.println("AXIS Rate of Interest: "+a.getRateOfInterest());  
}  
}  

我们可以覆盖静态方法吗?

不可以,静态方法不能被覆盖。可以通过运行时多态证明,因此我们将在以后学习。

为什么不能覆盖静态方法?

这是因为静态方法与类绑定,而实例方法与对象绑定。静态属于类区域,实例属于堆区域。

我们可以覆盖java main方法吗?

否,因为主要方法是静态方法。