Open In App

Overriding methods from different packages in Java

Improve
Improve
Like Article
Like
Save
Share
Report

Prerequisite : Overriding in Java, Packages in Java
Packages provide more layer of encapsulation for classes. Thus, visibility of a method in different packages is different from that in the same package.

How JVM find which method to call?
When we run a java program,

  • JVM checks the runtime class of the object.
  • JVM checks whether the object’s runtime class has overridden the method of the declared class.
  • If so, that’s the method called. Otherwise, declared class’s method is called.

Thus, the key point is visible check the visibility of method in different packages.

Following are the cases where we will see method overriding in different packages

1. Private method overriding : In this, access modifier of method we want to override is private.




// Filename: Hello.java
package a;
public class Hello {
    private void printMessage()
    {
        System.out.println("Hello");
    }
    public void fun()
    {
        printMessage();
    }
}
  
// Filename: World.java
package b;
import a.Hello;
public class World extends Hello {
    private void printMessage()
    {
        System.out.println("World");
    }
  
    public static void main(String[] args)
    {
        Hello gfg = new World();
        gfg.fun();
    }
}


Output:

Hello

As private method of parent class is not visible in child class. Thus no overriding takes place here.
If you don’t know how to run this program from terminal then, create Hello.java file and World.java file as specified above and run these commands.

2. Public method overriding : In this, access modifier of method we want to override is public.




// Hello.java
package a;
public class Hello {
    public void printMessage()
    {
        System.out.println("Hello");
    }
}
  
// World.java
package b;
import a.Hello;
public class World extends Hello {
    public void printMessage()
    {
        System.out.println("World");
    }
  
    public static void main(String[] args)
    {
        Hello gfg = new World();
        gfg.printMessage();
    }
}


Output:

World

Public method is accessible everywhere, hence when printMessage() is called, jvm can find the overridden method and thus call it.
Thus overriding takes place here.

3. Default method overriding




// Hello.java
package a;
public class Hello {
    void printMessage()
    {
        System.out.println("Hello");
    }
}
  
// World.java
package b;
import a.Hello;
public class World extends Hello {
    void printMessage()
    {
        System.out.println("World");
    }
    public static void main(String[] args)
    {
        Hello gfg = new World();
        gfg.printMessage();
    }
}


error: printMessage() is not public in Hello; cannot be accessed from outside package

Visibility of a default method is within its package only. Hence it can’t be access outside the package.
Thus, no overriding in this case.

Predict the output of the following program




/* Hello.java */
package a;
public class Hello {
    public void doIt()
    {
        printMessage();
    }
    void printMessage()
    {
        System.out.println("Hello");
    }
}
  
/* World.java */
package b;
import a.Hello;
public class World {
    private static class GFG extends Hello {
        void printMessage()
        {
            System.out.println("World");
        }
    
    public static void main(String[] args)
    {
        GFG gfg = new GFG();
        gfg.doIt();
    }
}


Output:

Hello

Explanation
Visibility of printMessage() is default in package a. Thus, no overriding takes place here.



Last Updated : 22 Jun, 2020
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads