Open In App

Can we override private methods in Java?

Last Updated : 17 Apr, 2024
Improve
Improve
Like Article
Like
Save
Share
Report

Let us first consider the following Java program as a simple example of Overriding or Runtime Polymorphism.

Java
class Base {
  public void fun() {
     System.out.println("Base fun");     
  }
}
  
class Derived extends Base {
  public void fun() {  // overrides the Base's fun()
     System.out.println("Derived fun");     
  }
  public static void main(String[] args) {
      Base obj = new Derived();
      obj.fun();
  }  
}

The program prints “Derived fun”. 
The Base class reference ‘obj’ refers to a derived class object (see expression “Base obj = new Derived()”). When fun() is called on obj, the call is made according to the type of referred object, not according to the reference. 

Is Overriding possible with private methods? 
Predict the output of the following program. 

Java
class Base {
  private void fun() {
     System.out.println("Base fun");     
  }
}
  
class Derived extends Base {
  private void fun() {
     System.out.println("Derived fun");     
  }
  public static void main(String[] args) {
      Base obj = new Derived();
      obj.fun();
  }  
}

We get compiler error “fun() has private access in Base” (See this). So the compiler tries to call base class function, not derived class, means fun() is not overridden.

An inner class can access private members of its outer class. What if we extend an inner class and create fun() in the inner class? 
An Inner class can access private members of its outer class, for example in the following program, fun() of Inner accesses private data member msg which is fine by the compiler.

Java
// Java program to demonstrate whether we can override private method 
// of outer class inside its inner class 
class Outer {
     private String msg = "GeeksforGeeks";
     private void fun() {
          System.out.println("Outer fun()");
     }

     class Inner extends Outer {
         private void fun()  {
               System.out.println("Accessing Private Member of Outer: " + msg);
         }
     }

     public static void main(String args[])  {

          // In order to create instance of Inner class, we need an Outer 
          // class instance. So, first create Outer class instance and then
          // inner class instance.
          Outer o = new Outer();
          Inner  i   = o.new Inner();
          
          // This will call Inner's fun, the purpose of this call is to 
          // show that private members of Outer can be accessed in Inner.
          i.fun();  

          // o.fun() calls Outer's fun (No run-time polymorphism).
          o = i; 
          o.fun();
     }
}

// Class 1 // Outer2 class 
class Outer2 { 
    // Method 1 
      // Private method of outer class 
    private void privateMethod() { 
        System.out.println("Private method in outer class"); 
    } 

    // Class 2 
      // Inner class 
    class Inner { 
        // Method 1 
          // Note: This will not be overriding private method of outer class 
        private void privateMethod() { 
            System.out.println("Private method in inner class"); 
        } 

        // Method 2 
          // Public method inside inner class 
        public void callPrivateMethod() { 
            // Calling private method of inner class 
            privateMethod(); 
        } 
    } 

    // Method 3 
      // Main driver method 
    public static void main(String[] args) { 
        // Creating object of outer and inner classes 
          // inside main() method 
        Outer2 outer = new Outer2(); 
        Outer2.Inner inner = outer.new Inner(); 
        inner.callPrivateMethod(); 
    } 
}

Output: 

Accessing Private Member of Outer: GeeksforGeeks
Outer fun()

In the above program, we created an outer class and an inner class. We extended Inner from Outer and created a method fun() in both Outer and Inner. If we observe our output, then it is clear that the method fun() has not been overridden. It is so because private methods are bonded during compile time and it is the type of the reference variable – not the type of object that it refers to – that determines what method to be called.. As a side note, private methods may be performance-wise better (compared to non-private and non-final methods) due to static binding.

Comparison With C++ 

1) In Java, inner Class is allowed to access private data members of outer class. This behavior is same as C++ (See this). 
2) In Java, methods declared as private can never be overridden, they are in-fact bounded during compile time. This behavior is different from C++. In C++, we can have virtual private methods (See this). 



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads