bloque4:herencia
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
bloque4:herencia [05/03/2018 11:19] – [Palabra clave Extends] Fernando Valdeón | bloque4:herencia [05/03/2018 11:35] (actual) – borrado Fernando Valdeón | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
- | ====== Herencia de Clases ====== | ||
- | En Java podemos tener clases que heredan de otras (extends, o extienden). Cuando una clase hereda de otra puede hacer uso de los atributos de su clase padre. Además, permite reescribir métodos en caso de que en una subclase queramos concretar su funcionamiento. | ||
- | Debemos tener en cuenta que toda clase en Java hereda de la clase '' | ||
- | |||
- | {{ : | ||
- | ==== ¿Para qué sirve? ==== | ||
- | La herencia es un mecanismo mediante el cual aprovechamos la implementación de operaciones de una clase padre (reutilización de código) y creamos nuevas clases hijas a partir de esa clase: | ||
- | * Heredando y posiblemente modificando y/o añadiendo operaciones. | ||
- | * Heredando y posiblemente añadiendo atributos. | ||
- | |||
- | **Debemos tener en cuenta que un método o atributo heredado mediante el mecanismo de herencia no puede ser suprimido en la subclase.** | ||
- | |||
- | Podríamos decir que la herencia nos permite usar el código empleando en una clase para no tener que volverlo a escribir en una subclase. Todas las subclases tienen las operaciones de la superclase, y así no tenemos que repetir el código en cada una. | ||
- | ===== Declaración de una Subclase ===== | ||
- | Si entendemos que una clase son “los planos” que definen la creación de un ejemplar de esa clase, podemos entender que cuando una clase hereda de otra, lo que está haciendo es usar los planos de la clase padre, y añadirle más información para crear más o diferentes funcionalidades a las que tenía. | ||
- | |||
- | Podemos llamar a las clases hijas '' | ||
- | Para que una subclase herede de una superclase debe usarse '' | ||
- | |||
- | Ejemplo de superclase: '' | ||
- | |||
- | <code java> | ||
- | public class Vehiculo{ | ||
- | | ||
- | | ||
- | |||
- | | ||
- | return Km; | ||
- | } | ||
- | |||
- | | ||
- | this.Km = Km; | ||
- | } | ||
- | |||
- | | ||
- | return matricula; | ||
- | } | ||
- | |||
- | | ||
- | this.matricula = matricula; | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | {{: | ||
- | Ahora vemos su uso y vemos que aparecen los métodos '' | ||
- | |||
- | Además del resto de métodos heredados de la clase '' | ||
- | |||
- | ---- | ||
- | |||
- | ==== Palabra clave Extends ==== | ||
- | |||
- | Vamos a crear ahora la clase '' | ||
- | <code java> | ||
- | public class Coche extends Vehiculo{ | ||
- | |||
- | // | ||
- | | ||
- | |||
- | // | ||
- | | ||
- | this.cilindrada = cilindrada; | ||
- | } | ||
- | |||
- | | ||
- | return cilindrada; | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | {{: | ||
- | Aquí vemos como aparecen los métodos heredados de la superclase Vehiculo: '' | ||
- | |||
- | Además tiene sus propios miembros específicos '' | ||
- | |||
- | También | ||
- | clase '' | ||
- | Ambas clases (Vehiculo y Coche) tienen el constructor estándar sin parámetros. | ||
- | |||
- | ---- | ||
- | |||
- | Hay que tener en cuenta que una subclase solo podrá acceder a los miembros de la superclase que sean '' | ||
- | |||
- | ==== Impedir la herencia ==== | ||
- | Si queremos que una clase no permita extender su funcionalidad, | ||
- | |||
- | <code java> | ||
- | public final class Vehiculo{ | ||
- | ... | ||
- | } | ||
- | </ | ||
- | |||
- | La palabra clave '' | ||
- | |||
- | Por ejemplo las clases '' | ||
- | ===== Constructor de la subclase ===== | ||
- | **Los constructores no se heredan**. __Siempre que se crea una instancia de una subclase, se crea primero una instancia de la superclase__. Esta instanciación puede ser implícita, o explícita, o lo que es lo mismo, invisible o visible. | ||
- | |||
- | En una clase se puede definir un constructor de forma explícita, o no definir ninguno. **Cuando no definimos un constructor, | ||
- | |||
- | Atendiendo a lo anterior, con los constructores de la subclase puede ocurrir 2 cosas: | ||
- | * **La superclase tiene un constructor sin parámetros** (ya sea el que define Java de forma implícita, o uno definido por nosotros que no tiene parámetros). En este caso en la subclase podemos definir un constructor, | ||
- | * **La superclase no tiene un constructor sin parámetros** (o sea, se ha definido uno con parámetros). En este caso Java no puede llamar de forma implícita al constructor de la superclase, ya que necesita saber qué valor dar a sus parámetros. Entonces estamos obligados a crear también un constructor en la subclase, cuya primera primera instrucción es una llamada al constructor de la superclase. Esto se hace usando la instrucción '' | ||
- | ==== Palabra clave super ==== | ||
- | Si en cualquier clase tenemos la palabra '' | ||
- | |||
- | Esto tiene su explicación, | ||
- | |||
- | A la hora de crear un constructor para la subclase, es necesario llamar al constructor de la superclase. Cuando el constructor/ | ||
- | |||
- | <code java> | ||
- | // | ||
- | public Vehiculo(int km, String matricula) { | ||
- | | ||
- | | ||
- | } | ||
- | ........ | ||
- | |||
- | // | ||
- | public Coche(int km, String matricula) { | ||
- | | ||
- | } | ||
- | |||
- | //Ó podemos tener también otro constructor en la subclase | ||
- | public Coche(int km, String matricula, int cilindrada) { | ||
- | | ||
- | | ||
- | } | ||
- | </ | ||
- | |||
- | Como vemos, si una clase hereda de otra, **y la superclase solo tiene constructores con argumentos, la subclase debe llamar a dicho constructor con al menos el mismo número de argumentos**, | ||
- | Una vez vez que se crea el constructor de la superclase, podemos crear los constructores de la subclase. | ||
- | |||
- | **Si una superclase no tiene contructor no-args, la subclase debe tener al menos los mismos constructores, | ||
- | |||
- | La palabra '' | ||
- | |||
- | ===== Sobrescritura de métodos: Override ===== | ||
- | Cada vez que una clase hereda un método, se tiene la posibilidad de sobrescribir el método. | ||
- | La sobrescritura de métodos se usa para definir el comportamiento específico de un método que tiene un comportamiento demasiado general en la superclase. Esto se denomina '' | ||
- | |||
- | <code java> | ||
- | // | ||
- | public class Vehiculo{ | ||
- | ... | ||
- | | ||
- | System.out.println(" | ||
- | } | ||
- | } | ||
- | |||
- | //Subclase Coche | ||
- | public class Coche extends Vehiculo{ | ||
- | ... | ||
- | | ||
- | | ||
- | // | ||
- | System.out.println(" | ||
- | } | ||
- | } | ||
- | |||
- | //Clase con método main | ||
- | ... | ||
- | public static void main(String[] args){ | ||
- | | ||
- | Coche miCoche = new Coche(); | ||
- | |||
- | | ||
- | | ||
- | } | ||
- | </ | ||
- | |||
- | **Cuando llama a un método, este se busca primero en su propia clase, y si no está, se buscará en la superclase, y así sucesivamente hasta llegar a la clase Object**. | ||
- | |||
- | ====Etiqueta @Override==== | ||
- | Cuando sobrescribimos un método es aconsejable (aunque no obligatorio) indicarle sobre su declaración, | ||
- | |||
- | <code java> | ||
- | @Override | ||
- | public String toString(){ | ||
- | | ||
- | } | ||
- | </ | ||
- | |||
- | **Existen una serie de normas que se deben cumplir al sobrescribir un método**, y la la etiqueta '' | ||
- | * La lista de parámetros del método sobrescrito debe ser exactamente la misma que el original (tipo y cantidad). Si no estaríamos sobrecargándolo (2 métodos distintos con el mismo nombre). | ||
- | * El tipo de retorno debe ser el mismo o un subtipo del tipo de retorno del método original. | ||
- | * El modificador de visibilidad **no puede ser más restrictivo** que el original, aunque si menos restrictivo. | ||
- | * No se puede sobrescribir un método marcado como '' | ||
- | |||
- | __Si incumplimos alguna de estas reglas__ y estamos usando el tag '' | ||
- | |||
- | ==== Impedir el Override de un método ==== | ||
- | Si quiero que un método no pueda ser sobrescrito (redefinido) en una subclase, debo indicarle en su definición el modificador '' | ||
- | |||
- | <code java> | ||
- | public class Vehiculo{ | ||
- | | ||
- | System.out.println(" | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | Ahora ninguna subclase de Vehiculo puede sobrescribir el método: **está obligada a usar el método original de Vehículo sin poder modificarlo**. | ||
- | ===== Modificador Protected ===== | ||
- | En el mecanismo de herencia, una subclase solo puede acceder a los miembros que tengan visbilidad '' | ||
- | |||
- | El modificador de visibilidad '' | ||
- | |||
- | **Un miembro protected permite ser accedido por la misma clase o por sus subclases, mientras que private solo permite por la propia clase**. | ||
- | |||
- | <code java> | ||
- | public class Vehiculo{ | ||
- | | ||
- | | ||
- | |||
- | | ||
- | System.out.println(" | ||
- | } | ||
- | } | ||
- | |||
- | public class Coche extends Vehiculo{ | ||
- | |||
- | | ||
- | //puedo acceder al atributo matricula | ||
- | System.out.println(" | ||
- | | ||
- | //No puedo acceder al atributo kilometros | ||
- | System.out.println(" | ||
- | } | ||
- | |||
- | // | ||
- | | ||
- | | ||
- | System.out.println(" | ||
- | } | ||
- | |||
- | |||
- | //Clase con método main | ||
- | public static void main(String[] args){ | ||
- | | ||
- | Coche miCoche = new Coche(); | ||
- | |||
- | | ||
- | | ||
- | | ||
- | } | ||
- | |||
- | |||
- | </ | ||
- | |||
- | ---- | ||
- | |||
- | (c) {{date> %Y}} Fernando Valdeón |
bloque4/herencia.1520248762.txt.gz · Última modificación: 16/09/2024 20:53 (editor externo)