Java @Override – Java中的重写
重写是编程语言中非常流行的概念。
在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注解。
覆盖与重载
| Overriding | Overloading |
|---|---|
| Overriding happens between superclass and subclass | Overloading 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. |

