Java - Polimorfismo :DDD

 
Vista:
sin imagen de perfil

Polimorfismo :DDD

Publicado por Jordi (135 intervenciones) el 09/06/2017 13:04:31
Hola chicas y chicos del Foro,
os cuento, resulta que llevo cuatro meses feliz de la vida creyendo conocer el concepto de Polimorfismo. Leyendo algunos post, al encontrarme con sentencias de Java que usan el polimorfismo no acababa de entender lo que querían decir, pero creyendo que la causa de no entenderlo era que no estaba concentrado en ese momento, el sueño, o mi bajo C. Intelectual, continuaba leyendo haciendo el acto de fe de que el polimorfismo que acababa de leer era una forma de pasar datos de un sitio a otro. Hasta que hoy, leyendo la documentación de jOpenDocument... ¡BOOM! ¡Me encuentro con que en realidad no tenía "ni puñetera idea" de que era el polimorfismo! He releído algunos artículos que hablan de este, y me he quedado con cara de O.o

Dejo un pequeño código que he hecho para "experimentar" para que veáis que parte del polimorfismo no entiendo:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Instrucciones{
 
	public static void main(String[] args) {
 
		A a = new A(); //A no tiene nada.
		B b = new B(); //B tiene una palabra con su getter.
		a = b; //A se transforma en B.
		System.out.println(((B)a).getPalabra()); //Haciendo un cambio de tipo, es como si A hubiera amacenado los datos de B, pese a que A no tiene nada.
 
	}
}
 
class A{}
 
class B extends A{
 
	private final String palabra = "sample_text";
 
	public String getPalabra(){
 
		return palabra;
 
	}
}


¿Porqué la variable 'palabra' de la clase B no se pierde al hacer la transformación a tipo A?
¿Porque salta error de compilación si trato de hacer b = a; pero no salta este error si lo hago mediante b = (B)a;?

Mediante pruebas he pillado la mecánica del Polimorfismo, pero no le encuentro la lógica :(

Un abrazo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Polimorfismo :DDD

Publicado por Tom (1831 intervenciones) el 09/06/2017 13:51:55
Pues tendrás que repasarte un tema más, porque estás hablando de Herencia, no de Polimorfismo :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Polimorfismo :DDD

Publicado por Claudio (6 intervenciones) el 09/06/2017 14:16:32
Como bien señala Tom, estás hablando de Herencia, no de Polimorfismo.

Polimorfismo se refiere a el múltiple uso que se puede dar a un método (overloading o sobreccarga)

Cuando vos tenés por ejemplo:

1
2
3
4
5
6
7
public void saludar(){
    System.out.println("Hola");
}
 
public void saludar(String nombre){ // << Sobrecarga
    System.out.println("Hola " + nombre);
}

Estás aplicando un claro concepto de polimorfismo.

Yendo a tu pregunta sobre Herencia, la cosa es así.

1
2
3
4
5
A a = new A(); // Creas una referencia llamada "a" a una instancia de objeto del tipo A
B b = new B(); // Creas una referencia llamada "b" a una instancia de objeto del tipo B
a = b // Estás diciendo que la referencia "a" ahora es igual a "b", ergo, apunta al mismo objeto que apuntaba b (uno del tipo B).
System.out.println(((B)a).getPalabra()); // Si bien "a" no tiene ningún método, al castearlo a B le estás diciendo al compilador ESTO ES DEL TIPO B! por lo que tenés acceso a métodos como getPalabra.
// Si no existiera la linea de a = b, te tiraría una runtime exception...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 349
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Polimorfismo :DDD

Publicado por Andrés (340 intervenciones) el 09/06/2017 20:35:45
Polimorfirmo significa a groso modo:

Dadas las clases:
class A{ void methodA(){}}
class B extends A {void methodA(){} void methodB(){}}
class C extends B {void methodC(){}}

Se cumple:
"B" es un "A", "C" es un "A" y "C" es un "B"

1.- Multilpes formas de un mismo método

1) A a = new B();
2) a.methodA();
3) a.methodB();

La linea 2 invoca methodA de B
La linea 3 causa error, solo puedes invocar metodos del tipo que referencia, en este caso A


2.- En una jerarquía de clases, la clase en un nivel superior, puede referenciar a cualquier clase de nivel inferior

i) A, puede referenciar a una variable de tipo A, B y C
ii) B, puede referenciar a una variable de tipo C
iii) C, puede referenciar a una variable de tipo C

Ejemplo 1:
1) A a = null;
2) B b = new B();
3) a = b;

La linea 3 no causa conflicto por i), es decir, "B" es un "A"

Ejemplo 2:
1) A a = new A();
2) B b = null;
3) b = a;
La linea 3 causa problema porque "A" no es un "B", B no esta jerarquicamente arriba de A

Siempre que se cumpla "A" es un "B", con a referenciando un objeto de la clase B, el cast (B)a, funciona.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Polimorfismo :DDD

Publicado por Jordi (135 intervenciones) el 10/06/2017 18:52:10
Muchas gracias por vuestras respuestas chicos, tan solo me queda una duda ¿Si tengo un objeto declarado como otro objeto de rango jerárquico superior, que sucede a nivel interno del lenguaje? Lo digo porque no logro entender el motivo de que los datos que hay en el objeto de rango inferior no se pierden al pasar a estar declarados como uno de rango superior que no tiene esas variables. ¿Podría decirse que están "congelados"?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar