Method Overriding:
Overriding in Java
In any object-oriented programming language, Overriding is a feature that allows a subclass or child class to provide a specific implementation of a method that is already provided by one of its super-classes or parent classes. When a method in a subclass has the same name, same parameters or signature and same return type(or sub-type) as a method in its super-class, then the method in the subclass is said to override the method in the super-class.
Method overriding is one of the way by which java achieve Run Time Polymorphism.The version of a method that is executed will be determined by the object that is used to invoke it. If an object of a parent class is used to invoke the method, then the version in the parent class will be executed, but if an object of the subclass is used to invoke the method, then the version in the child class will be executed.In other words, it is the type of the object being referred to (not the type of the reference variable) that determines which version of an overridden method will be executed.
// A Simple Java program to demonstrate // method overriding in java// Base Classclass Parent{ void show() { System.out.println("Parent's show()"); }}// Inherited classclass Child extends Parent{ // This method overrides show() of Parent @Override void show() { System.out.println("Child's show()"); }}// Driver classclass Main{ public static void main(String[] args) { // If a Parent type reference refers // to a Parent object, then Parent's // show is called Parent obj1 = new Parent(); obj1.show(); // If a Parent type reference refers // to a Child object Child's show() // is called. This is called RUN TIME // POLYMORPHISM. Parent obj2 = new Child(); obj2.show(); }}Output: |
Parent's show() Child's show()
Rules for method overriding:
- Overriding and Access-Modifiers : The access modifier for an overriding method can allow more, but not less, access than the overridden method. For example, a protected instance method in the super-class can be made public, but not private, in the subclass. Doing so, will generate compile-time error.
// A Simple Java program to demonstrate// Overriding and Access-ModifiersclassParent{// private methods are not overriddenprivatevoidm1() { System.out.println("From parent m1()");}protectedvoidm2() { System.out.println("From parent m2()"); }}classChildextendsParent{// new m1() method// unique to Child classprivatevoidm1() { System.out.println("From child m1()");}// overriding method// with more accessibility@Overridepublicvoidm2() { System.out.println("From child m2()");}}// Driver classclassMain{publicstaticvoidmain(String[] args){Parent obj1 =newParent();obj1.m2();Parent obj2 =newChild();obj2.m2();}}Output :From parent m2() From child m2()
- Final methods can not be overridden : If we don’t want a method to be overridden, we declare it as final. Please see Using final with Inheritance .
// A Java program to demonstrate that// final methods cannot be overriddenclassParent{// Can't be overriddenfinalvoidshow() { }}classChildextendsParent{// This would produce errorvoidshow() { }}Output :13: error: show() in Child cannot override show() in Parent void show() { } ^ overridden method is final - Static methods can not be overridden(Method Overriding vs Method Hiding) : When you defines a static method with same signature as a static method in base class, it is known as method hiding.The following table summarizes what happens when you define a method with the same signature as a method in a super-class.
SUPERCLASS INSTANCE METHOD SUPERCLASS STATIC METHOD SUBCLASS INSTANCE METHOD Overrides Generates a compile-time error SUBCLASS STATIC METHOD Generates a compile-time error Hides /* Java program to show that if static method is redefined bya derived class, then it is not overriding,it is hiding */classParent{// Static method in base class which will be hidden in subclassstaticvoidm1() { System.out.println("From parent static m1()");}// Non-static method which will be overridden in derived classvoidm2() { System.out.println("From parent non-static(instance) m2()"); }}classChildextendsParent{// This method hides m1() in Parentstaticvoidm1() { System.out.println("From child static m1()");}// This method overrides m2() in Parent@Overridepublicvoidm2() { System.out.println("From child non-static(instance) m2()");}}// Driver classclassMain{publicstaticvoidmain(String[] args){Parent obj1 =newChild();// As per overriding rules this should call to class Child static// overridden method. Since static method can not be overridden, it// calls Parent's m1()obj1.m1();// Here overriding works and Child's m2() is calledobj1.m2();}}Output :From parent static m1() From child non-static(instance) m2()
- Private methods can not be overridden : Private methods cannot be overridden as they are bonded during compile time. Therefore we can’t even override private methods in a subclass.
- The overriding method must have same return type (or subtype) : From Java 5.0 onwards it is possible to have different return type for a overriding method in child class, but child’s return type should be sub-type of parent’s return type. This phenomena is known as covariant return type.
- Invoking overridden method from sub-class : We can call parent class method in overriding method using super keyword.
// A Java program to demonstrate that overridden// method can be called from sub-class// Base ClassclassParent{voidshow(){System.out.println("Parent's show()");}}// Inherited classclassChildextendsParent{// This method overrides show() of Parent@Overridevoidshow(){super.show();System.out.println("Child's show()");}}// Driver classclassMain{publicstaticvoidmain(String[] args){Parent obj =newChild();obj.show();}}Output:Parent's show() Child's show()
- Overriding and constructor : We can not override constructor as parent and child class can never have constructor with same name(Constructor name must always be same as Class name).
- Overriding and Exception-Handling : Below are two rules to note when overriding methods related to exception-handling.
- Rule#1 : If the super-class overridden method does not throws an exception, subclass overriding method can only throws the unchecked exception, throwing checked exception will lead to compile-time error.
/* Java program to demonstrate overriding whensuperclass method does not declare an exception*/classParent{voidm1() { System.out.println("From parent m1()");}voidm2() { System.out.println("From parent m2()"); }}classChildextendsParent{@Override// no issue while throwing unchecked exceptionvoidm1()throwsArithmeticException{ System.out.println("From child m1()");}@Override// compile-time error// issue while throwin checked exceptionvoidm2()throwsException{ System.out.println("From child m2");}}Output:error: m2() in Child cannot override m2() in Parent void m2() throws Exception{ System.out.println("From child m2");} ^ overridden method does not throw Exception - Rule#2 : If the super-class overridden method does throws an exception, subclass overriding method can only throw same, subclass exception. Throwing parent exception in Exception hierarchy will lead to compile time error.Also there is no issue if subclass overridden method is throwing exception.
/* Java program to demonstrate overriding whensuperclass method does declare an exception*/classParent{voidm1()throwsRuntimeException{ System.out.println("From parent m1()");}}classChild1extendsParent{@Override// no issue while throwing same exceptionvoidm1()throwsRuntimeException{ System.out.println("From child1 m1()");}}classChild2extendsParent{@Override// no issue while throwing subclass exceptionvoidm1()throwsArithmeticException{ System.out.println("From child2 m1()");}}classChild3extendsParent{@Override// no issue while not throwing any exceptionvoidm1(){ System.out.println("From child3 m1()");}}classChild4extendsParent{@Override// compile-time error// issue while throwing parent exceptionvoidm1()throwsException{ System.out.println("From child4 m1()");}}Output:error: m1() in Child4 cannot override m1() in Parent void m1() throws Exception ^ overridden method does not throw Exception
- Rule#1 : If the super-class overridden method does not throws an exception, subclass overriding method can only throws the unchecked exception, throwing checked exception will lead to compile-time error.
- Overriding and abstract method : Abstract methods in an interface or abstract class are meant to be overridden in derived concrete classes otherwise compile-time error will be thrown.
- Overriding and synchronized/stricfp method : The presence of synchronized/stricfp modifier with method have no effect on the rules of overriding, i.e. it’s possible that a synchronized/stricfp method can override a non synchronized/stricfp one and vice-versa.
Note :
- In C++, we need virtual keyword to achieve overriding or Run Time Polymorphism. In Java, methods are virtual by default.
- We can have multilevel method-overriding.
// A Java program to demonstrate// multi-level overriding// Base ClassclassParent{voidshow() { System.out.println("Parent's show()"); }}// Inherited classclassChildextendsParent{// This method overrides show() of Parentvoidshow() { System.out.println("Child's show()"); }}// Inherited classclassGrandChildextendsChild{// This method overrides show() of Parentvoidshow() { System.out.println("GrandChild's show()"); }}// Driver classclassMain{publicstaticvoidmain(String[] args){Parent obj1 =newGrandChild();obj1.show();}}Output :GrandChild's show()
- Overriding vs Overloading :
- Overloading is about same method have different signatures. Overriding is about same method, same signature but different classes connected through inheritance.
- Overloading is an example of compiler-time polymorphism and overriding is an example of run time polymorphism.
- Overloading is about same method have different signatures. Overriding is about same method, same signature but different classes connected through inheritance.
Why Method Overriding ?
As stated earlier, overridden methods allow Java to support run-time polymorphism. Polymorphism is essential to object-oriented programming for one reason: it allows a general class to specify methods that will be common to all of its derivatives, while allowing subclasses to define the specific implementation of some or all of those methods.Overridden methods are another way that Java implements the “one interface, multiple methods” aspect of polymorphism.
Dynamic Method Dispatch is one of the most powerful mechanisms that object oriented design brings to bear on code reuse and robustness. The ability of existing code libraries to call methods on instances of new classes without recompiling while maintaining a clean abstract interface is a profoundly powerful tool.
Overridden methods allow us to call methods of any of the derived classes without even knowing type of derived class object.
When to apply Method Overriding ?(with example)
Overriding and Inheritance : Part of the key to successfully applying polymorphism is understanding that the superclasses and subclasses form a hierarchy which moves from lesser to greater specialization. Used correctly, the superclass provides all elements that a subclass can use directly. It also defines those methods that the derived class must implement on its own. This allows the subclass the flexibility to define its own methods, yet still enforces a consistent interface. Thus, by combining inheritance with overridden methods, a superclass can define the general form of the methods that will be used by all of its subclasses.
Let’s look at a more practical example that uses method overriding. Consider a employee management software for an organization, let the code has a simple base class Employee, the class has methods like raiseSalary(), transfer(), promote(),.. etc. Different types of employees like Manager, Engineer, ..etc may have their own implementations of the methods present in base class Employee. In our complete software, we just need to pass a list of employees everywhere and call appropriate methods without even knowing the type of employee. For example, we can easily raise salary of all employees by iterating through list of employees. Every type of employee may have its own logic in its class, we don’t need to worry because if raiseSalary() is present for a specific employee type, only that method would be called.
// A Simple Java program to demonstrate application// of overriding in Java// Base Classclass Employee{ public static int base = 10000; int salary() { return base; }}// Inherited classclass Manager extends Employee{ // This method overrides show() of Parent int salary() { return base + 20000; }}// Inherited classclass Clerk extends Employee{ // This method overrides show() of Parent int salary() { return base + 10000; }}// Driver classclass Main{ // This method can be used to print salary of // any type of employee using base class refernce static void printSalary(Employee e) { System.out.println(e.salary()); } public static void main(String[] args) { Employee obj1 = new Manager(); // We could also get type of employee using // one more overridden method.loke getType() System.out.print("Manager's salary : "); printSalary(obj1); Employee obj2 = new Clerk(); System.out.print("Clerk's salary : "); printSalary(obj2); }}Output: |
Manager's salary : 30000 Clerk's salary : 20000

No comments:
Post a Comment