TEMA 4. Herencia
![]() |
![]() |
![]() |
Título del Test:![]() TEMA 4. Herencia Descripción: Cuestionario sobre herencia en Java Fecha de Creación: 2023/01/02 Categoría: Informática Número Preguntas: 34
|




Comentarios |
---|
NO HAY REGISTROS |
La inclusión de métodos implementados en las interfaces a partir de Java 8 tiene como objetivo: Permitir la inclusión de nuevos métodos siendo compatibles las clases de versiones previas. Permiten añadir herencia múltiple de clases en el lenguaje. No tienen ningún objetivo adicional, salvo la inclusión del código. En una interface en Java hasta la versión 7 incluida: Sólo se pueden definir signaturas de métodos abstractos. Hay atributos y métodos implementados. No tienen código ejecutable. En Java tenemos herencia... Múltiple de clases. Simple o múltiple de clases en función de la sintaxis utilizada. Simple de clases. Cuando se ejecuta el constructor en Java: Se inicializa el objeto, sin necesidad de reutilizar los constructores de nuestros ancestros. Como los constructores se heredan, no es necesario indicar nada. Se realizan llamadas implícitas o explícitas a los constructores de los ancestros. Una conversión upcast en la jerarquía de herencia: Es ilegal. Es opcional usar un molde de conversión. Obliga a usar un molde de conversión. El modificador protected permite el acceso a: Sólo a descendientes. Sólo a clientes del mismo paquete. Clientes del mismo paquete y descendientes. Dado el siguiente código al instanciar un objeto de tipo B: class A { int i; } class B extends A { int i; B () { i = 1; } }. Se tiene un atributo i, con valor 0. Se tienen dos atributos i, uno con valor 0, y otro con valor 1. Se tiene un atributo i, con valor 1. Siguiendo el principio de Liskov podríamos decir: Algunos rectángulos pueden verse como polígonos. Todo rectángulo puede verse como un polígono. Todo polígono puede verse como rectángulo. A partir de Java 8, un método en una interfaz... Ya no son implícitamente abstract. No pueden incluir un cuerpo de instrucciones. Puede incluir un cuerpo de instrucciones si se utiliza la palabra clave default. En un descendiente los invariantes son: Más restrictivos. Iguales. Menos restrictivos. En Java 8, en caso de conflicto de un método concreto de una clase y un método implementado en una interfaz: Se prefiere el de la clase. Se prefiere el de la interfaz. No se detecta realmente como conflicto en compilación. El polimorfismo permite que a una variable de un tipo de referencia a objeto... No hay restricciones en la asignación de variables de cualquier tipo. Sólo se pueden asignar variables de sus subtipos. Sólo se pueden asignar variables de ese mismo tipo. La inicialización en herencia: Se usa super si tenemos constructores no por defecto en las superclases. Siempre se tiene que usar la referencia super. Se usa this para invocar al constructor de la superclase. En Java, hasta su versión 7, no había conflictos de herencia múltiple porque: Se evitan los conflictos con renombrados. No existe herencia múltiple de clases. No se pueden heredar dos propiedades distintas y concretas con el mismo nombre. En Java, en caso de incompatibilidad en el intento de asignación de variables referencia a objeto con un molde (cast): Se lanza una excepción en tiempo de ejecución por incompatibilidad de tipos. Se produce una asignación de valor nulo a la variable. Se produce un error en tiempo de compilación. Una clase final en Java: Tiene infinitos descendientes. Tiene como máximo un descendiente. No puede tener descendientes. En Java 8, si se heredan dos métodos diferentes, uno implementado en una interfaz y el otro abstracto de una clase con misma signatura: Se prefiere el método implementado en la interfaz. Se prefiere el método abstracto en la clase. Se debe redefinir el método. La ligadura dinámica se basa: En el tipo de la clase que contiene la variable. En el tipo dinámico de las variables. En el tipo estático de las variables. En Java existe herencia múltiple: De interfaces con clases. De interfaces con interfaces. De clases con clases. Dado el siguiente código al instanciar un objeto de tipo B: class A { int i; } class B extends A { int i; B () { super.i = 1; } }. Se tiene sólo un atributo i, con valor 0. Se tiene sólo un atributo i, con valor 1. Se tienen dos atributos i, uno con valor o y otro con valor 1. Si tenemos el siguiente código, la invocación es correcta si: var.operacion();. Sólo si operacion es un método definido y accesible en la clase que implementa el tipo de la variable var. Sólo si operacion es un método definido y accesible en un ancestro de la clase que implementa el tipo de la variable var. Sólo si operacion es un método definido y accesible en la clase que implementa el tipo de la variable var o bien alguno de sus ancestros. Una clase abstracta en Java: No es instanciable. Es instanciable. Es una interface. Dado el siguiente código podemos decir que: Poligono p1 = new Triangulo (); Triangulo t = new Triangulo (); Poligono p2 = new Poligono ();. Tenemos dos instancias directas de triángulo, y una instancia de polígono. Tenemos dos instancias directas de triángulo, y tres instancias de polígono. Tenemos tres instancias directas de polígono. En Java 8, en caso de heredarse por varios caminos un método implementado en una interfaz y redefinido por alguno de los caminos de herencia: Se obliga al programador a resolver la ambigüedad. Se prefiere el más general. Se prefiere el más específico. La referencia paterna en Java es: myBase. super. baseClass. this. La herencia puede ser vista como: Relación jerárquica o conjuntos de tipos. Mapa de Karnaugh. No tiene una representación gráfica asociada. Si redefinimos un método público en el ancestro, como privado en el descendiente: Es correcto independientemente del uso que se vaya a hacer del método. Es incorrecto hacer más restrictivo el modificador en el descendiente. Es correcto si nadie intenta usar el método del descendiente. La siguiente redefinición de método: @Override void metodo () { super.metodo (); }. Sobra el uso de super. No tiene ningún efecto. Es obligatoria incluirla para que la clase pueda compilar. En Java tenemos de manera estricta. Sobrecarga de operadores y métodos. Sobrecarga de operadores. Sobrecarga de métodos. El concepto de herencia está ligado al principio de: Reutilizar clases, sin modificar las superclases. Copiar y pegar manualmente el código de las superclases en las subclases. Tener que editar las superclases para poder habilitar la herencia. Una clase en Java que hereda un método abstracto y no lo implementa: Pasa a ser una interface. Puede ser concreta. Pasa a ser abstracta. Una conversión downcast en la jerarquía de herencia: Es opcional usar un molde de conversión. Es ilegal si los tipos coinciden. Exige usar un molde de conversión. El polimorfismo se basa en: En el tipo estático de las variables. En el tipo dinámico de las variables. En el tipo de la clase que contiene una variable. Una redefinición en Java: Se produce sólo en métodos. Se produce sólo en atributos. Se produce en atributos y métodos. |