Java @Override – Java中的重写

时间:2020-02-23 14:36:44  来源:igfitidea点击:

重写是编程语言中非常流行的概念。
在Java中重写方法的情况是,我们在父类和子类中都存在相同的方法。
它是用Java实现运行时多态性的OOPS概念之一。

用Java覆盖

让我们看看我们通常如何重写Java中的方法。

package com.theitroad.annotations;

public class BaseClass {
  
  public void doSomething(String str){
      System.out.println("Base impl:"+str);
  }
  
}

现在,我们将创建一个重写BaseClassdoSomething方法的子类。

package com.theitroad.annotations;

public class ChildClass extends BaseClass{

 public void doSomething(String str){
     System.out.println("Child impl:"+str);
 }

}

现在,让我们创建一个测试类来检查重写在Java中的工作方式。

package com.theitroad.annotations;

public class OverrideTest {

  public static void main(String[] args) {
      BaseClass bc = new ChildClass();
      bc.doSomething("override");
  }

}

上面程序的输出是:

Child impl:override

Java中的方法重写

Java覆盖如何工作?

  • 方法签名在父类和子类中必须完全相同。

  • 创建实例时,必须使用子类构造函数。

  • 在编译时,变量引用超类。
    但是,在运行时,它引用子类对象。

  • 当在变量上调用该方法时,看起来将调用超类方法。
    但是该方法存在于子类对象中,因此被称为。

这里的" bc"是BaseClass类型,但在运行时是ChildClass的对象。
因此,当我们调用其doSomething(String str)方法时,它将在ChildClass中查找该方法,并在输出中进行查找。

Java Override是否可以与其他方法签名一起使用?

现在,如下所示更改BaseClass的doSomething方法。

//Change argument from String to Object
public void doSomething(Object str){
  System.out.println("Base impl:"+str);
}

您会注意到,编译器不会引发任何警告/错误,现在,如果您运行测试程序,输出结果将会是:

Base impl:override

原因是ChildClass不再重写BaseClass的doSomething(Object str)方法。
因此,它正在调用BaseClass实施。
在这种情况下,ChildClass重载了doSomething()方法,因为方法名称相同,但方法签名不同。

Java @Override批注

Java 1.5引入了注释。
Java@ Override注释是默认的Java注释之一。
当我们将此注释用于方法时,它告诉编译器我们正在尝试覆盖超类方法。

如果取消注释ChildClass中的@Override注释,则会收到以下编译时错误消息:

The method doSomething(String) of type ChildClass must override or implement a supertype method

Java @Override注释的好处

  • Java @Override批注将确保方法签名中的任何超类更改都将导致编译时错误,并且您将必须进行必要的更改以确保类按预期工作。

  • 与在运行时相比,最好在编译时解决潜在的问题。
    因此,在尝试覆盖超类方法时,请始终使用java @Override注解。

覆盖与重载

OverridingOverloading
Overriding happens between superclass and subclassOverloading is present in the same class
The method signature must be the same in superclass and subclass.The method name must be the same but method signature must be different.
Identification of the method to be called happens at runtime.We can identify the method to be called at compile-time.
If overriding breaks, it can have adverse effects because the program will compile and run. However, the method from superclass will be called rather than subclass.If we change method name to break overloading, the error will come at compile time. So it's easy to fix and don't cause much harm.
Overriding is also called Runtime Polymorphism.Overloading is called as Compile-time Polymorphism.