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. |