Java教程-详解Java 方法覆盖

如果子类(派生类)拥有与父类中声明的方法具有相同名称的方法,那么在Java中称为方法覆盖。换句话说,子类提供了对父类中已声明的方法的具体实现。
Java方法覆盖的使用
- 提供对超类已经提供的方法的具体实现。
- 实现运行时多态性。
Java 方法覆盖规则
- 方法名称必须与父类中的名称相同。
- 方法的参数列表必须与父类中的参数列表相同。
- 必须存在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%的利率。
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 是一个静态方法。