Autor Tema: Ejercicio CU00696B herencia, interfaces, tipo estático y dinámico java  (Leído 5608 veces)

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Citar
a) ¿Una clase puede heredar de dos clases en Java?
b) ¿Una interface Java puede tener métodos que incluyan una sentencia while? ¿Una interface Java
puede tener métodos que incluyan una sentencia System.out.println?
c) ¿Un objeto Java puede ser del tipo definido por una interface? ¿Un objeto Java puede ser al mismo
tiempo del tipo definido por una interface y del tipo definido por una clase que no implementa la
interface? ¿Un objeto Java puede ser al mismo tiempo del tipo definido por una interface y del tipo
definido por una clase que implementa la interface?
a) ¿Una clase puede heredar de dos clases en Java?

Respuesta a): No.
Solo puede heredar de una clase
-----------------------
b) ¿Una interface Java puede tener métodos que incluyan una sentencia while? ¿Una interface Java puede tener métodos que incluyan una sentencia System.out.println?

Respuesta b): No.
Los métodos de un 'interface' no pueden contener una sentencia 'while' ni ninguna otra, pues al ser todos los métodos de un 'interface' abstractos el cuerpo de su código está vacío.
Por el mismo motivo tampoco pueden contener una sentencia 'System.out.println'
--------------------------
c1) ¿Un objeto Java puede ser del tipo definido por una interface?

Respuesta: Si, singún problema.
-----------------------
c2) ¿Un objeto Java puede ser al mismo tiempo del tipo definido por una interface y del tipo definido por una clase que no implementa la interface?

Respuesta: Si.
Cualquier objeto (instancia de una clase) puede pertenecer a:
 una clase que no tiene relación con otras clases
 una clase que exiende de otra (hereda de otra clase estandard)
 una clase implementa de otra u otras interfaces (hereda de ellas)
 una clase que extiende de otra clase estandard y de otras interfaces

Ejem.
public class Clase1 extends Clase2 implements Interface1 {...}
public class Clase2 {...}

Los objetos de  Clase1 implementan de Interface1 y extienden de Clase2 aunque esta 'Clase2' no implementa de Interface1
------------------------
c3) ¿Un objeto Java puede ser al mismo tiempo del tipo definido por una interface y del tipo definido por una clase que implementa la interface?

Respuesta: Si
Un objeto que pertenece a una clase que implementa de una interface, ya está cumpliendo estas condiciones, está ligada a esta clase y a esta interface.

Saludos
« Última modificación: 03 de Septiembre 2014, 08:12 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Re:Ejercicio CU00696B Preguntas y respuestas
« Respuesta #1 en: 03 de Septiembre 2014, 08:11 »
Hola toni, las respuestas a), b), c1) y c3) las veo correctas.

En relación a la pregunta c1), tener en cuenta que los objetos pueden tener un tipo estático definido por una interface, pero no un tipo dinámico (es decir, no se puede usar new sobre un tipo definido por una interface porque son definiciones abstractas sin constructor).

La respuesta c2) la veo discutible. Haz la prueba tú mismo: declara una interface Interface1, una clase Clase1 que implemente la interface, y una clase Clase2 que herede de Clase1.

Luego en una clase con el main trata de generar lo siguiente:

Interface1 miVar = new Clase1();

Y compáralo con lo que ocurre si escribieras lo siguiente:

Interface1 miVar = new Clase2();

Creo que a partir de ese resultado tú mismo serás capaz de sacar conclusiones y comentárnoslas.

La respuesta c2) en principio sería que no es posible, aunque si encuentras un contraejemplo habría que revisarla.

Saludos!!!

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Ejercicio CU00696B herencia, interfaces, tipo estático y dinámico java
« Respuesta #2 en: 04 de Septiembre 2014, 21:39 »
Hola Mario
Siguiendo tu cita
Citar
En relación a la pregunta c1), tener en cuenta que los objetos pueden tener un tipo estático definido por una interface, pero no un tipo dinámico (es decir, no se puede usar new sobre un tipo definido por una interface porque son definiciones abstractas sin constructor).

Yo, pasaba por alto que un objeto se puede declarar perteneciente a una interface, independientemente de como se inicialize.
Después de leer tu cita, recuerdo haberlo visto en otros ejercicios y para más inri se comentaba en la lección de este ejercicio.

Citar
Podemos declarar variables del tipo interfaz, pero para inicializarlas utilizaremos una clase concreta que lo implemente. Por ejemplo List <String> miLista; declara una variable con el tipo de la interface List. La inicialización miLista = new List<String>(); no es posible porque no se puede crear un objeto del tipo definido por una interfaz. En cambio miLista = new LinkedList<String> (); sí es válido.

Es decir que me fui directo p'al toro sin encomendarme a nadie.

Ahora, siguiendo tus indicaciones (a veces lo hago por mi cuenta) he creado las clases 'las incluyo en este mensaje' y en la clase con main he creado tres objetos:

Interface1 miVar1 = new Clase1();
Interface1 miVar2 = new Clase2();
Clase2 miVar22 = new Clase2();

Estas tres instrucciones no dan error

Del  primer objeto 'miVar1' puedo invocar los métodos de su propia clase sin problema (Ver clase Test con main)

Del objeto 'miVar2' puedo invocar los métodos que hereda de Clase1, pero no los de su clase (la Clase2)
Al definir el objeto perteneciente a 'interface1' delimita que métodos tendrá diponibles.
Todo lo que hereda de 'Clase1' está disponible
Como la 'Clase2' no implementa la 'interface1', este objeto 'miVar2' no tiene acceso a los métodos de la 'Clase2'

Finalmente el objeto 'miVar22' declarado e inicializado perteneciente a la clase 'Clase2' no tiene ningún problema en acceder a los métodos de su clase (el método getNombre() pertenece a la 'Clase2') ni a los métodos que hereda de 'Clase1' (el método propietario() pertenece a la clase 'Clase1')

Mi resumen.
Aunque la Clase2 disfruta de los métodos que hereda de Clase1.
¿Porque crear la Clase2 que tendrá sus propios métodos y usarla en el entorno de la Interface1 que no implementa y donde no podrá disfrutar de sus propios métodos?
No tiene sentido, es complicarse la vida.

Solución.
En lugar de usar la Clase2, usar la Clase1.
O bien, implementar Interface1 en Clase2 y se tendrá acceso a  los métodos propios de Clase2.

Interface1
Código: [Seleccionar]
public interface Interface1 {
    String propietario();
}
Clase1
Código: [Seleccionar]
public class Clase1 implements Interface1 {   
    @Override
    public String propietario() {
        return "\"Clase propietaria - " + this.getClass() + "\" -> Valor devuelto por el método 'propietario()' de la clase 'Clase1'.";
    }
} // Fin de la clase Clase1
Clase2
Código: [Seleccionar]
public class Clase2 extends Clase1 {     
    private String nombre;

    public Clase2() {            // Inicializa atributos
        this.nombre = "\"Clase propietaria - " + this.getClass() + "\" -> Valor inicializado en el 'constructor' de la clase 'Clase2'.";
    }
   
    public String getNombre() { return nombre; }
} // Fin de la clase Clase2
Test
Código: [Seleccionar]
public class Test {         
    public static void main(String [] args) {
        System.out.println("\fPrueba1");
        Interface1 miVar1 = new Clase1();
        System.out.println("\n\tmiVar1.propietario()=\n"+miVar1.propietario());

        Interface1 miVar2 = new Clase2();
        System.out.println("\n\tmiVar2.propietario()=\n"+miVar2.propietario()); // este método se hereda de Clase1 
        //La siguiente instrucción da error. No encuentra el metodo getNombre
//         System.out.println(miVar2.getNombre());
        System.out.println("\n\tmiVar2.getNombre()=\nDa el error (cannot find symbol - method getNombre())");

        Clase2 miVar22 = new Clase2();
        System.out.println("\n\tmiVar22.propietario()=\n"+miVar22.propietario()); // este método se hereda de Clase1
        System.out.println("\n\tmiVar22.getNombre()=\n"+miVar22.getNombre());
    }
} // Fin de la clase Test
Saludos.

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Re:Ejercicio CU00696B herencia, interfaces, tipo estático y dinámico java
« Respuesta #3 en: 04 de Septiembre 2014, 22:17 »
En general implementar y usar interfaces conlleva ventajas que se van descubriendo a medida que se profundiza en la programación. Los programadores novatos suelen usar expresiones como ArrayList miLista = new ArrayList(); mientras que los más avanzados en general usarán List miLista = new ArrayList(); para hacer uso de las ventajas del polimorfismo.Fíjate que List es una interface que es implementada por distintas clases (échale un vistazo al api de java si quieres). Los conceptos son un tanto complejos y hay que ir asimilándolos dando un margen de tiempo para que "se vayan asentando". A partir de ahí, creo que vas en la buena línea y es interesante que pruebes código y distintas situaciones como has hecho en este caso. Saludos,

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".