2012-08-15 12 views
20

¿Se pueden anular los métodos privados en Java? Si no, ¿cómo funciona el siguiente código?¿Se puede anular un método privado en superclase en la subclase?

class Base{ 
     private void func(){ 
      System.out.println("In Base Class func method !!");   
     }; 
} 

class Derived extends Base{ 
     public void func(){ // Is this a Method Overriding..????   
      System.out.println("In Derived Class func method"); 
     }  
} 

class InheritDemo{ 
     public static void main(String [] args){      
      Derived d = new Derived(); 
      d.func(); 
     } 
} 

Respuesta

2

No, no lo es. Puede marcar una anulación sólo para asegurarse de esta manera:

@Override 
public void func(){ 
    System.out.println("In Derived Class func method"); 
} 

Y en este caso, sería un error de compilación.

+1

Good old '@ Override', super útil! – TheZ

+0

gracias por responder ... pero el código funciona bien incluso si hice el método en la superclase final ... Entonces, ¿qué creo es que si usamos la misma firma del método en la subclase con un modificador diferente, simplemente estamos creando un nuevo método? de la subclase en lugar de anular la anterior. – AnkitChhajed

+0

ver edición. Leí mal 'privado'. XD – Doorknob

17

No, un método privado no puede anularse porque no es visible desde ninguna otra clase. Has declarado un nuevo método para tu subclase que no tiene relación con el método de la superclase. Una forma de verlo es preguntarse si sería legal escribir super.func() en la clase Derivada. No hay forma de que un método primordial sea prohibido para acceder al método que está anulando, pero este sería precisamente el caso aquí.

+1

sí ... y si se sobrescribe, entonces si creo una referencia de la superclase y le asigno el objeto de clase base. t también debe funcionar pero no es – AnkitChhajed

1

Usted no está reemplazando. No puede anular miembros privados, simplemente está definiendo un nuevo método en Derivados. Derived no tiene conocimiento La implementación de la Base de func() ya que se declaró como privada. No obtendrá un error de compilación cuando defina func() en Derivado, pero eso se debe a que Derived no sabe Base tiene una implementación de func(). Para que quede claro: sería incorrecto decir que está anulando la implementación de Base de func().

+0

oh oops Leí mal 'private' XD – Doorknob

1

No porque si hace algo como Base b = new Derived();, no podrá llamar a b.func(). Lo que estás haciendo se llama "esconder".

+0

hmm ... muchas gracias – AnkitChhajed

37

No, no lo está anulando. Puede verificar tratando de marcarlo con @Override, o tratando de hacer una llamada al super.func();. Ambos no funcionarán; arrojan errores de compilación.

Además, mira esto:

class Base { 
     private void func(){ 
      System.out.println("In base func method");   
     }; 
     public void func2() { 
      System.out.println("func2"); 
      func(); 
     } 
} 

class Derived extends Base { 
     public void func(){ // Is this an overriding method? 
      System.out.println("In Derived Class func method"); 
     } 
} 

class InheritDemo { 
     public static void main(String [] args) { 
      Derived D = new Derived(); 
      D.func2(); 
     } 
} 

se imprimirá:

func2 
In base func method 

Cuando cambia func() en Base al público, continuación que habrá un aumento al presupuesto, y la salida se cambie a:

func2 
In Derived Class func method 
+1

@Polygnome: +1 para el ejemplo que demuestra que no es una anulación, y para la prueba' @ Override'. –

+2

+1 para mostrar cómo funciona el envío dinámico (o no funciona: D) en este caso. –

+1

muy buena respuesta. –

0

Como el método es privado, no es visible para las otras clases. Por lo tanto, la clase derivada no hereda este método. Así que esto es no el caso de anulación

0

Ocultación del método se producirá aquí en lugar de anular. como lo que sucede en caso de estática.

0

En realidad, usted no está overriding.Before Java5

de un método reemplazado tipo de retorno debe coincidir con el método de la clase padre.

Pero Java 5 introdujo una nueva función denominada tipo de retorno covariante. Puede anular un método con la misma firma pero devuelve una subclase del objeto devuelto. En otras palabras, un método en una subclase puede devolver un objeto cuyo tipo es una subclase del tipo devuelto por el método con la misma firma en la superclase. puede seguir este hilo: Can overridden methods differ in return type?

-1

No puede anular algo que es invisible O no existe para la subclase.

Cuestiones relacionadas