Wikipedia define virtual methods como:Los métodos en paradigmas orientados a objetos pueden ser reemplazados por los métodos con la misma firma en las clases heredadas. Las variables sin embargo no pueden. ¿Por qué?
En la programación orientada a objetos, una función virtual o un método virtual es una función o método cuyo comportamiento puede ser anulado dentro de una clase que hereda por una función con la misma firma [para proporcionar un comportamiento polimórfico].
De acuerdo con la definición, todos los métodos no estáticos en Java es por defecto, excepto virtuales métodos finales y privadas. El método que no puede heredarse para el comportamiento polimórfico es , no, un método virtual.
Los métodos estáticos en Java nunca pueden anularse; por lo tanto, no tiene sentido declarar un método estático como definitivo en Java porque los métodos estáticos en sí mismos se comportan como los métodos finales. Simplemente pueden ser ocultos en las subclases por los métodos con la misma firma. Evidentemente, esto se debe a que los métodos estáticos nunca pueden tener un comportamiento polimórfico: un método que se anula debe lograr el polimorfismo, que no es el caso con los métodos estáticos.
Del párrafo anterior, se puede llegar a una conclusión importante. Todos los métodos en C++ son por defecto estáticos porque ningún método en C++ puede comportarse polimórficamente hasta que se declaren explícitamente como virtuales en la superclase. Por el contrario, todos los métodos en Java excepto los métodos finales, estáticos y privados son por defecto virtuales porque tienen comportamiento polimórfico por defecto (no es necesario declarar explícitamente métodos como virtuales en Java y, en consecuencia, Java no tiene palabras clave como "virtual")
Ahora, demostremos que las variables de instancia (también estáticas) no pueden comportarse polimórficamente a partir del siguiente ejemplo simple en Java.
class Super
{
public int a=5;
public int show()
{
System.out.print("Super method called a = ");
return a;
}
}
final class Child extends Super
{
public int a=6;
@Override
public int show()
{
System.out.print("Child method called a = ");
return a;
}
}
final public class Main
{
public static void main(String...args)
{
Super s = new Child();
Child c = new Child();
System.out.println("s.a = "+s.a);
System.out.println("c.a = "+c.a);
System.out.println(s.show());
System.out.println(c.show());
}
}
La salida producida por el fragmento de código anterior es como sigue.
s.a = 5 c.a = 6 Child method called a = 6 Child method called a = 6
En este ejemplo, ambas llamadas s.show()
y c.show()
hecho con el método show()
a través de las variables de tipo Super
y de tipo Child
, respectivamente, invoque el método show()
en la clase Child
. Esto significa que el método show()
en la clase Child
anula el método show()
en la clase Super
porque ambos tienen la firma idéntica.
Esto, sin embargo, no se puede aplicar a la variable de instancia a
declarada en ambas clases.En este caso, s.a
se referiría a a
en la clase Super
y visualización 5
y c.a
se referiría a a
en la clase Child
y mostrar 6
significa que a
en los Child
clase sólo cueros (y no altera temporalmente como le ocurrió a no estático métodos) a
en la clase Super
.
Después de esta larga discusión, solo hay una pregunta. ¿Por qué las variables de instancia (y el resto también) no se anulan? ¿Cuáles fueron las razones especiales para implementar tal mecanismo? ¿Habría habido ventajas o desventajas si hubieran sido anuladas?
Los métodos no virtuales de C++ no son estáticos. son métodos de instancia que no pueden ser anulados. Son similares a los métodos finales en Java: métodos de instancia que no se pueden anular. –
'De acuerdo con el párrafo anterior, se puede llegar a una conclusión importante. Todos los métodos en C++ (también en C) son por defecto estáticos porque ningún método en C++ puede comportarse polimórficamente hasta que se declaren explícitamente como virtuales en la base': un método estático no puede acceder al objeto [no 'this' para estos métodos ] mientras que una función no virtual [predeterminada] en C++ puede – amit
Creo que la palabra "anulada" no es aplicable a las variables. Usted anula el comportamiento, pero no el estado. Se puede acceder a las variables desde la subclase, por lo que no es necesario "anular" (puede cambiar su valor y tiene el mismo nombre). También hay algo llamado sombreado, por lo que si redeclara otra variable con el mismo nombre, es otra variable diferente en tiempo de ejecución. –