橘子味的心
标题:Java方法重写

如果子类中具有与父类中声明相同的方法,在java中称为方法覆盖。换句话说,如果子类提供了由其父类提供的其中一个方法的特定实现,则它被称为方法覆盖。所以方法覆盖有两个前提条件:继承和子父类中方法名称相同。

Java方法覆盖的用法

  • 方法重写用于提供有别于超类提供的方法的特定实现。
  • 方法重写用于运行时多态性。

Java方法覆盖的规则

  1. 方法必须与父类中的名称相同。
  2. 方法必须具有与父类中相同的参数。
  3. 必须是IS-A关系(继承)。

理解没有方法覆盖的问题

下面让我们来了解如果在程序中不使用方法覆盖可能面临的问题。

  1. class Vehicle {
  2. void run() {
  3. System.out.println("Vehicle is running");
  4. }
  5. }
  6.  
  7. class Bike extends Vehicle {
  8.  
  9. public static void main(String args[]) {
  10. Bike obj = new Bike();
  11. obj.run();
  12. }
  13. }
  14. Java

执行上面代码,输出结果如下 -

  1. Vehicle is running
  2. Java

问题是,必须在子类中提供一个run()方法,这就是为什么要使用方法覆盖。

方法覆盖的示例

在下面的这个例子中,在父类中和子类中都定义了run方法,但子类中有一些特定的实现。 方法的名称和参数是相同的,并且类之间有IS-A关系,因此这里run方法被覆盖了。

  1. class Vehicle {
  2. void run() {
  3. System.out.println("Vehicle is running");
  4. }
  5. }
  6.  
  7. class Bike2 extends Vehicle {
  8. void run() {
  9. System.out.println("Bike is running safely");
  10. }
  11.  
  12. public static void main(String args[]) {
  13. Bike2 obj = new Bike2();
  14. obj.run();
  15. }
  16. }
  17. Java

执行输出结果如下 -

  1. Bike is running safely
  2. Java

Java方法重写的实例

考虑下面一个真实应用的情况,Bank是一个提供获取利率的功能的类。 但是,利息率因银行不同而有所区别。 例如,SBIICICIAXIS银行可以提供8%7%9%的利率。

  1. class Bank {
  2. int getRateOfInterest() {
  3. return 0;
  4. }
  5. }
  6.  
  7. class SBI extends Bank {
  8. int getRateOfInterest() {
  9. return 8;
  10. }
  11. }
  12.  
  13. class ICICI extends Bank {
  14. int getRateOfInterest() {
  15. return 7;
  16. }
  17. }
  18.  
  19. class AXIS extends Bank {
  20. int getRateOfInterest() {
  21. return 9;
  22. }
  23. }
  24.  
  25. class Test2 {
  26. public static void main(String args[]) {
  27. SBI s = new SBI();
  28. ICICI i = new ICICI();
  29. AXIS a = new AXIS();
  30. System.out.println("SBI Rate of Interest: " + s.getRateOfInterest());
  31. System.out.println("ICICI Rate of Interest: " + i.getRateOfInterest());
  32. System.out.println("AXIS Rate of Interest: " + a.getRateOfInterest());
  33. }
  34. }
  35. Java

执行输出结果如下 -

  1. SBI Rate of Interest: 8
  2. ICICI Rate of Interest: 7
  3. AXIS Rate of Interest: 9
  4. Java

问题:可以覆盖静态方法吗?

答: 这是不可以的,静态方法不能被覆盖。可以通过运行时多态来证明不能覆盖,在稍后章节中将学习它。

问题: 为什么不能覆盖静态方法?
答: 因为静态方法是绑定类,而实例方法绑定对象。 静态属于类区域,实例属于堆区域。

问题:可以重写java main方法吗?

答: 这是不可以的,因为main是一个静态方法。

java方法重载和方法重写之间的区别: