如果子类(派生类)拥有与父类中声明的方法具有相同名称的方法,那么在Java中称为方法覆盖。换句话说,子类提供了对父类中已声明的方法的具体实现。

Java方法覆盖的使用

  • 提供对超类已经提供的方法的具体实现。
  • 实现运行时多态性。

Java 方法覆盖规则

  1. 方法名称必须与父类中的名称相同。
  2. 方法的参数列表必须与父类中的参数列表相同。
  3. 必须存在IS-A关系(继承)。

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

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

//Java程序来演示为什么我们需要方法覆盖 
//在这里,我们用子类调用父类的方法 
//类对象。 
//创建父类 
class Vehicle{  
  void run(){System.out.println("车辆正在行驶");}  
}  
//Creating a child class  
class Bike extends Vehicle{  
  public static void main(String args[]){  
  //创建子类实例  
  Bike obj = new Bike();  
  //使用子类实例调用方法   
  obj.run();  
  }  
}  

输出:

车辆正在行驶

问题在于我们必须在子类中提供 run() 方法的具体实现,这就是我们使用方法覆盖的原因。

方法覆盖示例

以下是一个方法覆盖的示例,我们在子类中定义了 run() 方法,与父类中的方法具有相同的名称和参数,但它有一个特定的实现。由于子类是父类的一种类型(IS-A 关系),所以方法被重写(覆盖)。

//Java Program来说明Java Method Overriding的使用 
//创建一个父类。   
class Vehicle{  
  //定义一个方法  
  void run(){System.out.println("自行车正在行驶");}  
}  
//创建子类
class Bike2 extends Vehicle{  
  //定义与父类相同的方法  
  void run(){System.out.println("自行车正在安全行驶");}  
  
  public static void main(String args[]){  
  Bike2 obj = new Bike2();//创建对象  
  obj.run();//调用方法  
  }  
}  

输出:

自行车正在安全行驶

Java 方法重写的真实示例

考虑下面的实际示例,其中Bank是一个提供获取利率的类。然而,不同的银行具有不同的利率。例如,SBI、ICICI和AXIS银行分别提供8%、7%和9%的利率。

bankinheritance.png

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

//Java程序演示Java Method Overriding的真实场景 
//其中三个类重写父类的方法。 
//创建一个父类。  
class Bank{  
int getRateOfInterest(){return 0;}  
}  
//创建字类 
class SBI extends Bank{  
int getRateOfInterest(){return 8;}  
}  
  
class ICICI extends Bank{  
int getRateOfInterest(){return 7;}  
}  
class AXIS extends Bank{  
int getRateOfInterest(){return 9;}  
}  
//测试类创建对象并调用方法 
class Test2{  
public static void main(String args[]){  
SBI s=new SBI();  
ICICI i=new ICICI();  
AXIS a=new AXIS();  
System.out.println("SBI 利率: "+s.getRateOfInterest());  
System.out.println("ICICI 利率: "+i.getRateOfInterest());  
System.out.println("AXIS 利率: "+a.getRateOfInterest());  
}  
}  

输出:

SBI 利率:8
ICICI 利率:7
AXIS 利率:9

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

不,不能覆盖静态方法。可以通过运行时多态来证明,后面再学习。


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

这是因为静态方法与类绑定,而实例方法与对象绑定。static属于class区,instance属于heap区。


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

不,因为 main 是一个静态方法。

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想