📅  最后修改于: 2020-09-24 03:21:29             🧑  作者: Mango
如果子类(子类)具有与父类中声明的方法相同的方法,则在Java中称为方法重写。
换句话说,如果子类提供其父类之一已声明的方法的特定实现,则称为方法重写。
让我们了解一下,如果不使用方法重写,可能会在程序中遇到问题。
"//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
}
}
输出:
考虑一个场景,其中Bank是提供获取利率的功能的类。但是,利率因银行而异。例如,SBI,ICICI和AXIS银行可以提供8%,7%和9%的利率。
"//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());
}
}
不可以,静态方法不能被覆盖。可以通过运行时多态证明,因此我们将在以后学习。
这是因为静态方法与类绑定,而实例方法与对象绑定。静态属于类区域,实例属于堆区域。
否,因为主要方法是静态方法。