¿Podemos anular los métodos privados en Java?

Consideremos primero el siguiente programa Java como un ejemplo simple de anulación o polimorfismo en tiempo de ejecución.

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();
  } 
}

El programa imprime «Diversión derivada». 
La referencia de clase base ‘obj’ hace referencia a un objeto de clase derivado (consulte la expresión “Base obj = new Derived()”). Cuando se llama a fun() en obj, la llamada se realiza según el tipo de objeto al que se hace referencia, no según la referencia. 

¿Es posible anular con métodos privados? Prediga la salida del siguiente programa.  

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();
  } 
}

Obtenemos el error del compilador «fun() tiene acceso privado en Base» (Ver esto ). Entonces, el compilador intenta llamar a la función de la clase base, no a la clase derivada, lo que significa que fun() no se anula.

Una clase interna puede acceder a miembros privados de su clase externa. ¿Qué pasa si extendemos una clase interna y creamos fun() en la clase interna?  
Una clase interna puede acceder a miembros privados de su clase externa, por ejemplo, en el siguiente programa, fun() de Inner accede a msg de miembros de datos privados, lo cual está bien para el compilador.

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();
     }
}

Producción: 

Accessing Private Member of Outer: GeeksforGeeks
Outer fun()

En el programa anterior, creamos una clase externa y una clase interna. Ampliamos Inner from Outer y creamos un método fun() tanto en Outer como en Inner. Si observamos nuestra salida, entonces está claro que el método fun() no ha sido anulado. Es así porque los métodos privados están vinculados durante el tiempo de compilación y es el tipo de la variable de referencia, no el tipo de objeto al que se refiere, lo que determina a qué método llamar. . Como nota al margen, los métodos privados pueden tener un mejor rendimiento (en comparación con los métodos no privados y no finales) debido al enlace estático.

Comparación con C++ 
1) En Java, la clase interna puede acceder a miembros de datos privados de la clase externa. Este comportamiento es el mismo que el de C++ (Ver esto ). 
2) En Java, los métodos declarados como privados nunca se pueden anular, de hecho, están limitados durante el tiempo de compilación. Este comportamiento es diferente de C++. En C++, podemos tener métodos privados virtuales (Ver esto ).
Este artículo es una contribución de Chandra Prakash . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *