Está en la página 1de 62

TEMA 5

POO:
DESARROLLO
DE CLASES
AVANZADA

PROGRAMACIÓN JAKELIN SAYEL


“La inteligencia es la
capacidad de adaptarse
al cambio”.
Stephen Hawking
ÍNDICE

1. Composición
Concepto
herencia
2. Herencia:
○ Conceptos Básicos
○ Constructores de clases derivadas
○ Herencia en Java: Clase OBJECT
○ Métodos heredados y sobreescritos
○ Clases y métodos final
○ Acceso a miembros derivados
○ Ejemplo
3. Poliformismo
4. Resumen modificadores
5. Clases abstractas
6. Interfaces
1.
COMPOSICIÓN
● La composición es el agrupamiento de uno o varios objetos y valores dentro de una clase.
● La composición crea una relación ‘tiene’ o ‘está compuesto por’.
● Por ejemplo, un rectángulo está compuesto por dos puntos (cada uno con sus coordenadas x,y).

public class Rectangulo ● La composición de clases es una capacidad muy


{ Punto p1; potente de la POO ya que permite diseñar software
Punto p2; como un conjunto de clases que colaboran entre sí:
...
● Cada clase se especializa en una tarea concreta y
}
esto permite dividir un problema complejo en varios
sub-problemas pequeños.
public class Punto {
int x, y; ● También facilita la modularidad y reutilización del código.

}
1.
COMPOSICIÓN
● Una cuenta bancaria tiene un titular y un autorizado (ambas son personas con dni, nombre,
dirección, teléfono, etc.). Además de el saldo, la cuenta tendrá registrado un listado de
movimientos (cada movimiento tiene asociada un tipo, fecha, cantidad, concepto, origen o
destino, etc.).
public class CuentaBancaria public class Persona {
{ Persona titular; String dni, nombre,
Persona dirección, teléfono;
autorizado; double ...
saldo; }
Movimiento movimientos[];
... public class Movimiento
} { int tipo;
Date fecha;
double cantidad;
String concepto, origen, destino;
...
}
CONCEPTO DE HERENCIA
CONCEPTO DE HERENCIA

CARACTERÍSTICAS COMUNES

OMBRE GÉNERO EDAD LUGAR RESIDENCIA LA HERENCIA NOS


PERMITE CREAR LAS
CARACTERÍSTICAS Y
COMPORTAMIENTOS
COMUNES EN UNA SOLA
CLASE Y QUE LAS DEMÁS
LAS HEREDEN

COMPORTAMIENTOS COMUNES

COMEN HABLAN DUERMEN SE MUEVEN


CADA UNO ADEMÁS,
TENDRÁ SUS
PROPIAS
CARACTERÍSTICAS Y
COMPORTAMIENTO
CONCEPTO DE HERENCIA

¿Cómo podemos saber cuál es la clase padre?

➔ En el ejemplo de abuelo es fácil pero no siempre será así de sencillo.


➔ Usamos la regla “Es un” , que en la mayoría de las veces funciona
➔ Ejemplo:
◆ Un jefe es un empleado (siempre) ¿Cómo sería la herencia si ade
◆ Un empleado es un jefe (siempre)

SuperClase o Clase padre

jefe empleado Subclase o Clase hija

Empleado clase padre porque un


jefe siempre es un empleado
CONCEPTO
DE HERENCIA

➔ Un jefe no es siempre un director, puede ser jefe de área o departamento


➔ Un director siempre es un jefe y un jefe siempre es un empleado
➔ Un ordenanza siempre es un empleado pero no es un jefe ni un director
➔ Director hereda de jefe y empleado. Jefe hereda de empleado
➔ Ordenanza hereda de empleado
2. HERENCIA

2.1 Conceptos Básicos

➔ La herencia es una de las capacidades más importantes y


distintivas de la POO. Consiste en derivar o extender una clase
nueva a partir de otra ya existente de forma que la clase
nueva hereda todos los atributos y métodos de la clase
ya existente.
➔ A la clase ya existente se la denomina superclase, clase base
o clase padre. A la nueva clase se la denomina subclase, clase
derivada o clase hija.
Doctor
Cuando derivamos (o extendemos) una nueva clase, ésta hereda todos los datos y métodos miem
existente.
Cirujano
2.

2.1 Conceptos Básicos

➔ Por ejemplo, si tenemos un programa que va a


trabajar con alumnos y profesores, éstos van a
tener atributos comunes como el nombre, dni,
dirección o teléfono. Pero cada uno de ellos tendrán
atributos específicos que no tengan los otros. Por
ejemplo los alumnos tendrán el número de
expediente, el ciclo y curso que cursan y sus notas;
por su parte los profesores tendrán el código de
profesor, el departamento al que pertenecen, los
módulos que imparten y su horario.
2.

2.1 Conceptos Básicos public class Alumno extends Persona {


➔ Por lo tanto, en este caso lo mejor es declarar ...
una clase Persona con los atributos comunes }
(Nombre, DNI, Dirección, Teléfono) y dos sub-
clases Alumno y Profesor que hereden de Persona public class Profesor extends Persona {
(además de tener sus propios atributos). …
➔ Es importante recalcar que Alumno y Profesor } persona
también heredarán todos los métodos de
Persona.

profesor alumno
2. HERENCIA

2.1 Conceptos Básicos


➔ Para que una clase herede las características de otra hay que utilizar la palabra
clave (keyword) extends tras el nombre de la clase. .
➔ En Java sólo se puede heredar de una clase (a la clase de la que se hereda se la llama
superclase ).
2.

2.1 Conceptos Básicos: Composición vs Herencia

➔ Herencia:Todos los objetos(miembros) de una clase hija (subconjunto) son objetos


también de la clase padre (conjunto).

Clase hijo <<es-un>> Clase base o padre

➔ Composición :
Clase contenedora <<tiene-un>> Clase contenida
2.

2.1 Conceptos Básicos: UTILIDADES-VENTAJAS


➔Modelado de la realidad: modela las relaciones de especialización/generalización entre las entidades
del mundo real.
➔ Evita redundancias, facilita la reutilización de código.
➔ Sirve de soporte para el polimorfismo (lo veremos más adelante)
Existen dos tipos de herencia.

◆ Herencia simple: una clase solo puede tener un padre, por lo tanto la estructura de clases será
en forma de árbol.

◆ Herencia múltiple: Una clase puede tener uno o varios padres. La estructura de clases es un
grafo. (*)No soportada en Java
2.

2.1 Conceptos Básicos:


SITUACIONES EN LAS QUE SE PUEDE APLICAR LA HERENCIA
1. Especialización

•Dado un concepto B y otro concepto A que


representa una especialización de B, entonces
puede establecerse una relación de herencia
entre las clases de objetos que representan a
A y B.
2.

SITUACIONES EN LAS QUE SE PUEDE APLICAR LA HERENCIA

2. Extensión 3. Especificación
• Una clase puede servir para extender la •Una superclase puede servir para especificar la
funcionalidad de una superclase sin que funcionalidad mínima común de un conjunto
represente necesariamente un concepto de descendientes.
más específico.
2. HERENCIA

2.2 Constructores de clases derivadas


● El constructor de una clase derivada debe encargarse de construir los atributos que estén
definidos en la clase padre además de sus propios atributos.
● Dentro del constructor de la clase derivada, para llamar al constructor de la clase padre se
debe utilizar el método reservado super() pasándole como argumento los parámetros que
necesite.
● Si no se llama explícitamente al constructor de la clase base mediante super() el compilador
llamará automáticamente al constructor por defecto de la clase base. Si no tiene constructor por
defecto el compilador generará un error.
2.

2.2 Constructores de clases derivadas


● Si existe un miembro (atributo o método) con el mismo nombre en la clase creada y en la heredada,
para referirnos a la de la clase padre le anteponemos la palabra super.
super.<miembro>
● Una subclase puede invocar un constructor definido por su superclase por medio del siguiente
formato:
super(lista-parámetros);
(*)Siempre debe ser la primera instrucción del constructor.
Ejemplo:
super();
super(par1,par2,….);
2.

RECAPITULANDO
● ¿Cuándo crearemos una clase padre (base o superclase)? Principalmente bajo dos circunstancias:
1. Cuando caigamos en la cuenta de que diversos tipos (objetos) tienen algo en común. Pongamos
por ejemplo el juego del ajedrez: peones, alfiles, rey, reina, caballos y torres, son piezas del juego.
Crearíamos, por tanto, una clase padre y derivamos cada pieza individual a partir de dicha clase
base.
2. Cuando necesitemos ampliar la funcionalidad de un programa sin tener que modificar el
código existente.
● La POO nos permite crear tipos (objetos) a partir de una clase, la herencia nos permite extender esos
tipos sin necesidad de rescribir todo el código, únicamente escribimos las mejoras y lo demás se
hereda de la clase padre.
● Una regla que nos puede ayudar en el diseño de la jerarquía de herencia de clases en nuestros
programas de Java es la regla de “Es-un”. Si un objeto de la subclase “es-un” objeto de la
superclase, entonces el diseño sería correcto. Como hemos visto anteriormente.
2.

● Una vez que tenemos claro el diseño de la herencia, debemos


seguir tres simples consejos para que esta sea correcta:
➔ Poner las operaciones y campos comunes en la superclase.
➔ Procurar no utilizar campos protegidos.
➔ No abusar en el uso de la herencia. Usarla sólo cuando
tenga sentido.
2.

2.3 Herencia en Java: Clase OBJECT


➔ Estructura jerárquica en árbol de java; donde en la raíz
podemos encontrar la clase Object, de las que heredan todas
las clases.
● Todas las clases en Java tienen un padre
● Todos los objetos son “Object”
➔ Una clase derivada (o subclase) puede acceder directamente
a todos los atributos y métodos heredados que no sean
private; a estos se accederá a través de métodos (get(), La clase Object se da por supuesta y jamás h
set())
➔ Se heredan todos los atributos y métodos, excepto los
constructores, aunque estos últimos es posible reutilizarlos.
2. HERENCIA

2.3 Herencia en Java: Clase OBJECT


Una clase final no puede tener subclases.

➔ Si un método es static en la superclase, en la subclase también.


➔ Si un método no es static en la superclase, en la subclase tampoco.
➔ En Java todas las clases heredan de otra clase:
◆ Si lo especificamos en el código con la keyword extends, nuestra clase heredará de la
clase especificada.
◆ Si no lo especificamos en el código, el compilador hace que nuestra clase herede de la clase
Object (raíz de la jerarquía de clases en Java).
➔ Excepto los tipos primitivos, el resto de métodos campos etc de cualquier clase de Java, extienden
o heredan de Object.
2. HERENCIA

2.3 Herencia en Java: Clase OBJECT


➔ Esto significa que nuestras clases siempre van a contar con los atributos y métodos de la clase
Object
➔ Algunos de sus métodos
• public boolean equals(Object o);
Compara dos objetos y dice si son iguales.
• public String toString();
Devuelve la representación visual de un objeto.
• public Class getClass();
Devuelve la clase de la cual es instancia el objeto.
2. HERENCIA

2.4 Métodos heredados y sobreescritos


➔ ¿Qué pasa si en la superclase hay un método que funciona distinto
a como nos gustaría que funcionara en la subclase?
➔ ¿Son las subclases responsables de inicializar en sus constructores las variables heredadas de las
superclases?
➔ ¿Qué pasa si un método de la superclase no debiera aparecer en la subclase?
➔ Hemos visto que una subclase hereda los atributos y métodos de la superclase; además, se pueden
incluir nuevos atributos y nuevos métodos.
➔ Por otro lado, puede ocurrir que alguno de los métodos que existen en la superclase no nos sirvan en
la subclase (tal y como están programados) y necesitemos adecuarlos a las características de la
subclase. Esto puede hacerse mediante la sobreescritura de métodos:
2.

2.4 Métodos heredados y sobreescritos

➔ Eclipse nos avisa de que hay un método sobreescrito.


➔ Si en el clase hija creamos un método que se llame igual, porque lo necesitamos, que alguno
de la clase padre, java va a sobreescribir el método de la clase padre, es decir, invalida el
método que se hereda
2.

2.4 Métodos heredados y sobreescritos


Un método está sobrescrito o reimplementado cuando se programa de nuevo en la clase d

➔ Sobrescribir un método significa que una subclase reimplementa un método heredado.


➔ Para sobrescribir un método hay que respetar totalmente la declaración del método:
◆ El nombre ha de ser el mismo.
◆ Los parámetros y tipo de retorno han de ser los mismos.
◆ El modificador de acceso no puede ser más restrictivo.
➔ Al ejecutar un método, se busca su implementación de abajo hacia arriba en la jerarquía de clases.
2.

2.4 Métodos heredados y sobreescritos

Sobrescribir vs. Sobrecargar

➔ Sobrecargar un método es un concepto distinto a sobrescribir un método.


➔ La sobrecarga de un método significa tener varias implementaciones del mismo método
con parámetros distintos:
◆ Los parámetros tienen que ser distintos ( en número o tipo).
◆ El modificador de acceso puede ser distinto.
◆ El nombre ha de ser el mismo.
2.

2.4 Métodos heredados y sobreescritos


2.

2.4 Métodos heredados y sobreescritos


Un método está sobrescrito o reimplementado cuando se programa de nuevo en la clase d

➔ El método toString lo tienen todos los objetos ya que se hereda de la clase Object. De la que
heredan todas las clases de manera implícita. Este método es el que se invoca al mostrar un
objeto por pantalla y por defecto muestra la clase del objeto y una referencia a dónde se
encuentra en memoria. Por ejemplo la clase String lo tiene sobrescrito para mostrar por pantalla
el String que contiene. En cualquier clase puedes sobrescribir este método para que al mostrar
un objeto por pantalla se muestre lo que tú quieras.
➔ También el método equals que hemos utilizado en la clase String es heredado de Object. Por
lo tanto sabemos que cualquiera de estos dos métodos lo va a tener cualquier objeto de
cualquier clase en Java.
2.

2.4 Métodos heredados y sobreescritos: Constructores


➔ La palabra clave “super” es una facilidad del lenguaje para poder ejecutar constructores y
métodos heredados que han sido redefinidos. super se utiliza para acceder desde un objeto
a atributos y métodos (incluyendo constructores) del padre.
➔ Cuando el atributo o método al que accedemos no ha sido sobrescrito en la subclase, el uso de
super es redundante, no hace falta ponerlo.
➔ Los constructores de las subclases incluyen una llamada a super() por defecto, si no hemos
escrito un super o un this propio.
➔ Las subclases NO son responsables de inicializar las variables de instancia de
las variables que hereda.
➔ Para pasarle la responsabilidad de inicializar estas variables a las superclases puede llamar
al constructor de estas mediante la sentencia super()
➔ Hay una especie de “herencia” de constructores.
2.

2.4 Métodos heredados y


sobreescritos
● Ejemplo de acceso a un método:
● Ejemplo de acceso a un atributo:
public class ClasePadre {
public class ClasePadre { public void imprimir() {
public boolean atributo = true; System.out.println(“Método del
} padre”);
public class ClaseHija extends ClasePadre { }
public boolean atributo = false; }
public void imprimir() { public class ClaseHija extends ClasePadre {
System.out.println(atributo); public void imprimir() {
System.out.println(super.atributo); super.imprimir();
} System.out.println(“Método del hijo”);
} }
}
2.

2.5 Clases y métodos final

➔ Para una clase, final significa que la clase no puede extenderse, es


decir, no puede ser heredada
➔ Para un método, final significa que no puede redefinirse en una clase
derivada, es decir, no puede ser sobreescrito por las subclases.
➔ Para un dato miembro, final significa también que no puede ser redefinido en una clase
derivada, como para los métodos, pero además significa que su valor no puede ser cambiado en
ningún sitio; es decir el modificador final sirve también para definir valores constantes.
2. HERENCIA

2.6 Acceso a métodos derivados


2. HERENCIA

2.6 Acceso a métodos derivados


➔ La herencia de una clase no anula la restricción de acceso private. Por tanto, aunque una
subclase incluye todos los miembros de su superclase, no puede acceder a los que se hayan
declarado como private, si no es a través de sus métodos public.
➔ Se heredan todos los atributos y métodos de las clases public y protected ().
➔ En una jerarquía, tanto superclases como subclases pueden tener su propios constructores y
cada uno crea su parte del objeto.
➔ Recordar que la superclase no puede acceder a los elementos de la subclase pero sí al revés.
➔ La Orden de ejecución de los constructores en la jerarquía: en orden de derivación , de
superclase a subclase.
➔ Cuando instanciamos un objeto de la subclase hay que tener en cuenta que el constructor de la
superclase no se ejecuta automáticamente. Deberemos ejecutarlo mediante la cláusula super().
2. HERENCIA

2.7 Ejemplo
➔ Vamos a crear un programa que tenga una clase
padre Persona, con los atributos: nombre, dirección,
dni y teléfono. De esta clase heredarán Alumno, que
además tendrá los atributos número de expediente,
nombre del ciclo, curso y un array de 5 notas (para
las notas de las asignaturas), y crearemos también
Profesor, que tendrá los siguientes atributos extra:
código de profesor, departamento al que pertenece,
horario (mañana o tarde) y un array con los
nombres de las asignaturas que imparte (máximo 5)
➔ Ver ejemplo en el aula virtual.
3. POLIMORFISMO

➔ [RAE 2001]: Cualidad de lo que tiene o puede tener distintas formas


➔ El polimorfismo en POO se da por el uso de la herencia
➔ El polimorfismo es la propiedad de los objetos, que les permite adoptar diferentes
formas en tiempo de ejecución, así como que un objeto de una clase derivada sea
utilizado como un objeto de la clase base.
➔ Debido a esta propiedad y al principio de sustitución, se puede utilizar un objeto de
la subclase siempre que el programa espere un objeto de la superclase.
➔ Lo que determina la versión del método que será ejecutado es el tipo
de objeto al que se hace referencia y no el tipo de variable de
referencia.
3. POLIMORFISMO

➔ Se produce por distintas implementaciones de los


métodos definidos en la clase padre
(sobreescribir):
◆ Distinta implementación entre clase hija y padre
◆ Distinta implementación entre clases hija

➔ Una misma llamada ejecuta distintas sentencias dependiendo de la clase a la que pertenezca el
objeto.

➔ El código a ejecutar se determina en tiempo de ejecución => Enlace dinámico


3.

➔ Como se ha mencionado anteriormente en este mismo tema, hay una regla sencilla que nos
permite saber si la herencia es o no el diseño correcto para nuestros programas, para
nuestras clases.
➔ La regla “es-un” afirma que todo objeto de la subclase es un objeto de la superclase.
➔ Por ejemplo, imaginemos dos clases: Empleados y Jefes. En el caso de que una deba heredar de
otra ¿cuál sería el diseño de herencia correcto? ¿Debe heredar la clase Jefes de la clase
Empleados? ¿O debe ser al revés? En casos como este es donde debemos aplicar la regla “es-
un” para que el diseño de la herencia sea correcto.
➔ Aplicando dicha regla cabe decir que un Jefe “es-un” Empleado obligatoriamente. Sin embargo,
no podemos afirmar lo contrario: un Empleado no “es-un” Jefe obligatoriamente.
➔ Así que el diseño correcto debería ser que la clase Jefes herede de Empleados, o dicho de
otra forma, la clase Jefes debe ser subclase de Empleados o Empleados superclase de Jefes.
3.

➔ Otra manera de formular la regla “es-un” es el llamado principio de sustitución. Este afirma
que se puede utilizar un objeto del tipo de la subclase siempre que el programa espere un
objeto de la superclase. Por ejemplo, se puede asignar un objeto de subclase a una variable de
superclase.
➔ Jefes herede de Empleados, o dicho de otra forma, la clase Jefes debe ser subclase de
Empleados o Empleados superclase de Jefes.
➔ Otra manera de formular la regla “es-un” es el llamado principio de sustitución. Este afirma
que se puede utilizar un objeto del tipo de la subclase siempre que el programa espere un
objeto de la superclase. Por ejemplo, se puede asignar un objeto de subclase a una variable de
superclase.
3.

➔ En la imagen anterior vemos como por un lado tenemos un objeto de tipo Jefes llamado
“Juan” y por otro lado tenemos un Array de tipo Empleados llamado “losEmpleados”. Se puede
observar como se aplica el principio de sustitución asignando el objeto de tipo Jefes a la
variable de tipo Empleados. Este fenómeno es lo que se conoce como polimorfismo: una
variable de tipo Empleados puede referirse a un objeto de tipo Empleados o a cualquier objeto
de una subclase de Empleados (en este caso Jefes).
3.

Enlazado dinámico: Pongamos un ejemplo para entenderlo mejor:

En enlazado dinámico es otra


de las características de Java
que dota a este lenguaje de
potentes capacidades que
parecen casi mágicas. El
enlazado dinámico está
íntimamente relacionado con el
polimorfismo y es el proceso
mediante el cual el intérprete
Java conoce de qué tipo es una
variable polimórfica en tiempo
de ejecución (durante la
ejecución de un programa, de
ahí lo de dinámico).
3.

Enlazado dinámico
➔ Como se observa en la imagen anterior, tanto la clase Empleados como la
subclase Jefes tienen un método llamado getSueldo(). También vemos
como tenemos un objeto llamado “obj” que es de tipo Empleados. La
pregunta que surge es: ¿a cuál de los dos métodos getSueldo llama el
objeto “obj” a cada vuelta de bucle for-each? Lo normal sería pensar que
llama el método getSueldo() de la clase Empleados. Sin embargo, dentro
del bucle for-each el enlazado dinámico entra en acción debido a la
naturaleza polimórfica del objeto “obj”. A cada vuelta de bucle el objeto
“obj” se comportará de diferente forma, unas veces como Empleados y
otra como Jefes dando lugar al enlazado dinámico proceso por el cual en
ocasiones llamará al método getSueldo() de la clase Empleados y en
otras ocasiones al método getSueldo() de la clase Jefes, dependiendo
dela forma que tome obj.
3.

CASTING DE OBJETOS
public class UsoEmpleadosCAST {
public static void main(String[] args) {
JefesCAST lola= new JefesCAST("LOLA",3900, 2012, 04,29);
EmpleadosCAST [] losEmpleados= new EmpleadosCAST[6]; losEmpleados[0]= new
EmpleadosCAST("Juan", 2700, 2021, 10,02);
losEmpleados[1]= new EmpleadosCAST("Pepe", 1500, 2024, 12,03);
losEmpleados[2]= new EmpleadosCAST("Ana", 2500, 2022, 9,04);
losEmpleados[3]= new EmpleadosCAST("Eva", 1700, 2023, 8,05); losEmpleados[4]=
lola;// principio de sustitución ES UN
EmpleadosCAST lolaAdmin= lola; //UPcasting (casting implícito) una variable de tipo jefe la estamos guardando en una variable de tipo empleado que es la
clase padre!!
//¿Qué pasa si lo hacemos al revés?
//EmpleadosCAST lolo= new EmpleadosCAST("LOLO", 1500, 2024, 12,03);
//JefesCAST loloDirector= lolo; //no se puede convertir empleados a jefes y esto es porque no se cumple el principio de sustitución ES UN
// a veces, a la hora de programar es necesario hacer un DOWNCasting o casting explícito
// pensais que funcionaria si hacemos lo siguiente??
// JefesCAST loloDirector= (JefesCAST)lolo; //no da error de compilación
/*¿cómo lo solucionamos?-> haciendo de forma correcta el principio de sustitución
* si lolo va a ser jefe y un jefe ES UN siempre empleado podremos
* hacer la siguiente declaración y después castear
*/
3.

CASTING DE OBJETOS
EmpleadosCAST lolo= new JefesCAST("LOLO", 1500, 2024, 12,03); //puedo instanciar un objeto de tipo jefe en
// una variable de tipo Empleado
JefesCAST loloDirector= (JefesCAST)lolo; //DownCasting
//¿Para que lo vamos a usar?
//ejem: añadir una posición más al array para ver el ejemplo

losEmpleados[5]= new JefesCAST("Arturo", 3500, 2024, 12,03);


//¿Qué pasa si ahora quiero poner un incentivo'

//losEmpleados[5]. //no agarra el método setIncentivo de jefes porque el array es de tipo empleado
//Solución?? DownCasting

JefesCAST arturo= (JefesCAST) losEmpleados[5];

arturo.setIncetivo(111);

for (EmpleadosCAST obj: losEmpleados) {

System.out.println(obj.getDatosEmpleadosCast() + " y un sueldo de " + obj.getSueldo());

}
4. RESUMEN DE MODIFICADORES

La siguiente tabla sintetiza las características de los cuatro


modificadores
4. RESUMEN DE

➔ Los Modificadores de acceso se pueden aplicar a clases, métodos, variables y


constantes. Son de vital importancia ya que marcan la accesibilidad del elemento
al que se aplique. Por ejemplo, una variable protected tal y como marca la tabla
anterior, será accesible desde su propia clase, desde su propio paquete, desde una
subclase (clase que hereda de la clase donde está declarada la variable) pero no
será accesible desde otros paquetes.
➔ El modificador por defecto es quizás el más confuso. En ocasiones por descuido
del programador no se especifica modificador alguno por lo que se pasa a utilizar
el modificador por defecto. Quizás sin saberlo, estamos dando acceso a la variable,
método, constante o clase acceso desde otras clases del mismo paquete. Hay que
tener especial cuidado con este modificador.
5. CLASES

Métodos y clases abstractas


● A medida que ascendemos por la jerarquía de la herencia, las
clases se van volviendo más generales, más abstractas
● Llega un momento según ascendemos por la jerarquía en el que la
clase antecesora es tan general que pensamos en ella como base
de otras clases más que como una clase con objetos concretos.
● Nos encontramos con que las clases son cada vez, menos capaces de
hacer cosas, menos específicas o más abstractas.
● En este ejemplo la clase Empleados es la que menos cosas puede
hacer. Directores es la que más funcionalidades tiene al ir
heredando de las anteriores. Por eso se dice que según vamos
bajando en la jerarquía de herencia las clases son más funcionales o
específicas
5. CLASES ABSTRACTAS

Métodos y clases abstractas


● Podríamos crear otra clase superior más general Persona, en la
pondremos los métodos de getNombre() porque todas las personas
tienennombre. Pero no podríamos poner getSueldo(), ya que no
todas las personas tienen sueldo.
● Por ejemplo, si creamos otra clase alumno, el método getNombre
sería útil pero no el getSueldo.
● En este ejemplo, podríamos crear un método que sea
getDescripción(), para que muestre las descripción de
alumno,director…
● Lo tendríamos que declarar en la clase Persona para que pueda
heredarse.
● ¿Pero la descripción de un alumno sería igual que la de un director,
por ejemplo?
5. CLASES ABSTRACTAS

Métodos y clases abstractas


● ¿Pero la descripción de un alumno sería igual que la de un empleado,
por ejemplo?.Obviamente la respuesta es no.
● El método getNombre sí sería igual para todos, pero de un alumno
nos puede interesar curso, colegio, notas y de un empleado; salario,
cargo…etc.
● ¿Cuál es la solución?
■ Declarar ese método como método abstracto:
Un método abstracto sólo se declara, no se desarro
public abstract String class getDescripcion(); Se implementará obligatoriamente, en las subclase
//string porque quiero que me devuelve una descripción
//importante el punto y coma del final
5. CLASES

Métodos y clases abstractas


● Las subclases están obligadas a sobreescribir el método abstracto y desarrollarlo como le convenga
● Si en una clase declaramos un método como abstracto si o sí, esa clase deberá declarse también como
abstracta.
● Un clase abstracta, es aquella que al menos tiene un método abstracto. Obviamente, puede contener
otros métodos desarrollados como en nuestro ejemplo getNombre().
● ¿Podríais pensar y por qué esta complicación? ¿Por qué no declaro un método getDescrpción() en cada
clase y listo?
■ Si hacemos esto NO OBLIGAMOS A LAS CLASES QUE TENGAN EL MÉTODO getDescripcion()

El sentido último de crear clases abstractas y métodos abstractos, es marcar la pauta a seguir e
5. CLASES

public abstract class Principal {


// Método concreto con implementación
public void metodoConcreto() {
... Estructura general
}
// Método abstracto sin implementación
public abstract void metodoAbstracto();
}
Esta subclase hereda de Principal ambos métodos, pero está obligada a implementar el
código del método abstracto.
class Secundaria extends Principal {
// Implementación concreta
public void metodoAbstracto() {
...
} }
5. CLASES ABSTRACTAS

El siguiente ejemplo lo tendréis que subir al aula


5. CLASES ABSTRACTAS

El siguiente ejemplo lo tendréis que subir al aula virtual

Añade comentarios
ampliando las
explicaciones
5. CLASES ABSTRACTAS
5. CLASES ABSTRACTAS
5. CLASES ABSTRACTAS

Recapitulando:
● Imaginemos un escenario en el que no tenga sentido
● Una clase abstracta puede contener tanto
crear cierto tipo de objetos de una clase o se quiere
métodos abstractos (sin implementar)
evitar su creación, pero la clase es útil para
como no abstractos (implementados).
generalizar miembros de otras clases que heredan de
Pero al menos uno debe ser abstracto.
ella. En este caso nos interesará declarar esa clase
como Clase Abstracta. ● Para declarar una clase o método como
abstracto se utiliza el modificador
● Una clase abstracta es una clase que declara abstract.
la existencia de algunos métodos pero no su ● Una clase abstracta no se puede
implementación (es decir, contiene la cabecera instanciar, pero sí heredar.
del método pero no su código). Los métodos sin ● Las subclases tendrán que implementar
implementar son métodos abstractos. obligatoriamente el código de los
métodos abstractos (a no ser que
también se declaren como abstractas).
5. CLASES

Recapitulando:
● Una clase abstracta según hemos dicho no puede instanciarse, por lo que no tiene sentido
que tenga constructores.
● Una clase abstracta sí puede tener herencia.
● Una clase abstracta puede tener atributos y métodos.
● Los métodos de una clase abstracta pueden ser abstractos o normales. Método abstracto es
aquel que no tiene cuerpo.
● Para que una clase se declare como abstracta tenemos que usar la palabra clave abstrac
● Las clases que heredan de una clase abstract tienen la obligación de implementar los métodos
abstractos de la misma.
● Si la clases hija no queremos que implemente este método, la misma también debería ser
abstract.
● Un método abstract no puede ser static.
5. CLASES
5. CLASES

Si creamos una superclase abstracta vehículo con un método abstracto moverse():


● No podremos crear objetos Vehículo
● Deberemos sobreescribir el/los métodos abstractos de Vehículo en las subclases.
5. CLASES ABSTRACTAS
¿Preguntas?

También podría gustarte