如果子类中具有与父类中声明相同的方法,在java中称为方法覆盖。换句话说,如果子类提供了由其父类提供的其中一个方法的特定实现,则它被称为方法覆盖。所以方法覆盖有两个前提条件:继承和子父类中方法名称相同。 Java方法覆盖的用法
提供有别于超类提供的方法的特定实现。用于运行时的多态性。Java方法覆盖的规则
方法必须与父类中的名称相同方法必须具有与父类中相同的参数必须是IS—A关系理解没有方法覆盖的问题 下面让我们来了解如果在程序中不使用方法覆盖可能面临的问题。
class Vehicle { void run() { System.out.println("Vehicle is running"); } } class Bike extends Vehicle { public static void main(String args[]) { Bike obj = new Bike(); obj.run(); } }我们想让自行车实现自己的功能,但是如果不重写我们看到bike执行的还是父类的方法。 方法覆盖的示例 在下面的这个例子中,在父类中和子类中都定义了run方法,但子类中有一些特定的实现。 方法的名称和参数是相同的,并且类之间有IS-A关系,因此这里run方法被覆盖了。
class Vehicle { void run() { System.out.println("Vehicle is running"); } } class Bike2 extends Vehicle { void run() { System.out.println("Bike is running safely"); } public static void main(String args[]) { Bike2 obj = new Bike2(); obj.run(); } }结果如下:
Bike is running safely考虑下面一个真实应用的情况,Bank是一个提供获取利率的功能的类。 但是,利息率因银行不同而有所区别。 例如,SBI,ICICI和AXIS银行可以提供8%,7%和9%的利率。
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 Rate of Interest: " + s.getRateOfInterest()); System.out.println("ICICI Rate of Interest: " + i.getRateOfInterest()); System.out.println("AXIS Rate of Interest: " + a.getRateOfInterest()); } }结果如下:
SBI Rate of Interest: 8 ICICI Rate of Interest: 7 AXIS Rate of Interest: 9注:
不可以覆盖静态方法,因为静态方法是绑定类,而实例方法绑定对象。静态属于类区域,实例属于堆区域。不可以重写main()方法,因为其是一个静态方法。