如果子类中具有与父类中声明相同的方法,在java中称为方法覆盖。换句话说,如果子类提供了由其父类提供的其中一个方法的特定实现,则它被称为方法覆盖。所以方法覆盖有两个前提条件:继承和子父类中方法名称相同。
java方法覆盖的用法
java方法覆盖的规则
理解没有方法覆盖的问题
下面让我们来了解如果在程序中不使用方法覆盖可能面临的问题。
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();
}
}
执行上面代码,输出结果如下 -
vehicle is running
问题是,必须在子类中提供一个run()
方法,这就是为什么要使用方法覆盖。
在下面的这个例子中,在父类中和子类中都定义了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
问题:可以覆盖静态方法吗?
答: 这是不可以的,静态方法不能被覆盖。可以通过运行时多态来证明不能覆盖,在稍后章节中将学习它。
问题: 为什么不能覆盖静态方法?
答: 因为静态方法是绑定类,而实例方法绑定对象。 静态属于类区域,实例属于堆区域。
问题:可以重写java main方法吗?
答: 这是不可以的,因为main
是一个静态方法。
java方法重载和方法重写之间的区别: