其他
【Java编程教程】详解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面试那些事儿,获取651页Java面试题
//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面试那些事儿,获取651页Java面试题
# 我们可以覆盖 java main 方法吗?
不,因为 main 是一个静态方法。
扫码进群记得备注:城市、昵称和技术方向。