Java II - Programacion Orientada A Objetos (Parte 1) - Teoria
Java II - Programacion Orientada A Objetos (Parte 1) - Teoria
JAVA I
1.2. Herencia
1.4. Polimorfismo
2.1. Encapsulamiento
3.1. Composición
3.2. Genéricos
3.3. Colecciones
3.4. Excepciones
HERENCIA
PROGRAMACIÓN ORIENTADA
ABSTRACCIÓN POLIMORFISMO
A OBJETOS
ENCAPSULAMIENTO
Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una
jerarquía de clasificación (imagina la forma de un árbol jerárquico) y los objetos heredan
las propiedades y el comportamiento de las clases a las que pertenecen. La herencia nos
permite extender una clase existente para crear una clase más especializada.
3
© Accenture todos los derechos reservados Confidencial
1. PROGRAMACIÓN ORIENTADA A OBJETOS (PARTE I)
1.2. HERENCIA
La herencia nos permite extender una clase existente para crear una subclase más especializada.
La relación de herencia se describe como una relación ‘is-a’ (es-un) entre dos clases, por ejemplo
un coche es un vehículo. En estas relaciones identificamos dos tipos de clases:
Clase Padre (Base/Superclase): una clase de la que se deriva otra clase. Es la clase a partir
de la cual se van a crear especializaciones (en nuestro ejemplo sería la clase Vehiculo).
Clase Hija (Derivada/Subclase): una clase que se deriva de otra clase. Es la especialización
(en nuestro ejemplo sería la clase Coche).
Además, cualquier jerarquía que exista tendrá en la cúspide la clase implícita Object de la API de
Java de la que heredan todos los tipos de clases. Esto significa que la variable de referencia Object
puede usarse para referirse a un objeto de cualquier clase.
Siguiendo con nuestro ejemplo del coche, nuestra clase Coche será una clase hija que hereda de
la clase padre Vehiculo, que a su vez tendrá otras clases hijas, por ejemplo Moto.
CLASE PADRE
Clase Object
En nuestro ejemplo, ambas clases heredarán los atributos y métodos de la clase Vehiculo
(permitiendo así reutilizar el código ya existente en la clase padre), y adicionalmente podrán crear
más atributos y métodos propios que los hagan más especializados.
Por ejemplo sabemos que todos los coches tienen 4 ruedas, pero Motos las hay de 2 y 3 ruedas,
por ello uno de sus atributos será éste para poder diferenciar los diferentes objetos que creemos a
partir de la clase Moto. Y en los Coches ocurre igual con las puertas.
Ten en cuenta que… Las clases sólo pueden heredar de una única clase padre, aunque admite
alguna excepción (Herencia Múltiple) que veremos en el siguiente punto.
Clase Object: es la superclase implícita de la API de Java que se encuentra en lo más alto de la jerarquía de clases
(tanto las que existen en la API de Java como las que creamos nosotros). De ella heredan el resto de las clases.
4
Herencia única: una clase derivada se crea a partir de una sola clase base.
CLASE PADRE
CLASE HIJA
CLASE PADRE
Herencia multinivel: una clase derivada se crea a partir de una única clase base, y esta
clase derivada se convierte en la clase base para la nueva clase.
CLASE PADRE
CLASE HIJA
CLASE NIETA
Herencia múltiple: una clase derivada se crea a partir de más de una clase base.
CLASE HIJA
Ten en cuenta que… Java no admite este tipo de Herencia Múltiple con clases, es decir, no se
puede extender o heredar de dos clases a la vez, pero lo podríamos lograr haciendo uso de
Interfaces (lo veremos más adelante).
5
© Accenture todos los derechos reservados Confidencial
PROPIEDADES DE LA HERENCIA
La nueva clase puede incluir métodos y atributos propios para completar su función.
Una clase puede ser a la vez subclase y superclase (ejemplo Herencia multinivel).
Es decir, si al crear nuestra clase Coche queremos que herede los atributos y métodos de la clase
padre Vehiculo tendremos que declarar el nombre de la clase hija y añadir la palabra extends
seguida del nombre de la clase padre de la que hereda:
Atributos: definen las características que tendrán los objetos que crearemos a partir de la clase.
Método: es un conjunto de instrucciones definidas dentro de una clase, que realizan una determinada tarea. A la
hora de escribirlo hay que tener en cuenta el número de parámetros, el tipo de parámetros y el orden de estos.
Constructor: son un tipo de métodos especiales que inician los atributos de la clase cada vez que se crea un objeto
Habíamos visto que una de las propiedades de la herencia es que no se pueden heredar
constructores de una clase padre a una clase hija. Sin embargo, utilizando la palabra reservada
super podemos acceder a los atributos, métodos y constructores de la clase padre desde la
clase hija.
Ésta es similar a la que vimos en el curso anterior this (que nos permitía acceder a los atributos,
métodos y constructores de nuestra clase), pero en el caso de super llamamos/ accedemos a
los atributos, métodos y constructores de la clase padre.
CLASE PADRE
CLASE HIJA
public class Coche extends Vehiculo { Desde nuestra clase Coche, usando el
public Coche(){ comando super (), podremos acceder
super(); /*llamamos al constructor
vacío de la clase padre*/ al constructor de la clase padre
System.out.printIn (“Creando coche”); Vehículo.
}
public Coche(Coche c) {
super(c); /*llamamos al constructor Cuando creemos nuestro objeto la
de copia de la clase padre*/ consola nos imprimirá la frase
numeroPuertas = c.numeroPuertas; “Creando Vehículo” heredada y
}
} nuestra propia frase “Creando Coche”
Ten en cuenta que… Cuando se crea un objeto de una clase que hereda de otra, de forma
implícita, si no se ha indicado lo contrario, se ejecuta primero el constructor por defecto
(constructor vacío) de la clase padre, empezando por la más general, y va bajando en la jerarquía
de herencia, pero si necesitas usar otro constructor (de copia o parámetros) deberías llamarlo de
forma explícita.
7
© Accenture todos los derechos reservados Confidencial
1. PROGRAMACIÓN ORIENTADA A OBJETOS (PARTE I)
1.3. SOBRECARGA Y SOBRESCRITURA DE MÉTODOS
Nos da la posibilidad de tener dos o más tareas a ejecutar con el mismo nombre pero que tengan
diferente firma (reciban parámetros diferentes), con lo cual, a la hora de ejecutar Java sabe que
método debe ejecutar en función de la llamada a dicho método.
Para nuestro ejemplo de la clase Coche: Imagina que queremos crear un método que imprima
alguno de los atributos de nuestro coche, por ejemplo, el color y el año de fabricación del coche.
Hay que tener en cuenta que los parámetros serán diferentes en cada caso. En el caso del color,
será un atributo de tipo String (texto), y para el año será un atributo de tipo int (número entero).
En ambos casos usaremos el mismo método, que hemos llamado imprimir(). Por tanto, aunque
usemos el mismo método en ambos casos, como los parámetros son diferentes, se dice que
estaríamos sobrecargando el método:
/* Métodos sobrecargados */
public void imprimir(String color) {
System.out.printIn (“El color del coche es ” + color);
}
public void imprimir(int agno) {
System.out.printIn (“El año de fabricación del coche es ” + agno);
}
public static void main(String[] args) {
imprimir(“azul”);
imprimir(1980);
}
El método tiene el mismo nombre (Imprimir), pero distinta firma, es decir los parámetros son
diferentes (color, años) y de distinto tipo de dato (String e int).
Firma: en lenguaje de programación cuando hablamos de la firma nos referimos a los parámetros del método.
8
© Accenture todos los derechos reservados Confidencial
¿QUÉ ES LA SOBRESCRITURA DE MÉTODOS?
La sobrescritura de métodos sólo puede darse en una relación de herencia, es decir, las
subclases pueden sobrescribir los métodos que han heredado de la superclase o clase padre.
La sobrescritura es la forma por la cual una clase hija que hereda puede re-definir los métodos
(añadir o modificar la implementación) de su clase padre, pudiendo crear nuevos métodos con
el mismo nombre de su superclase pero con distinta funcionalidad.
Así como en la sobrecarga nos fijamos en la lista de parámetros, en la sobrescritura nos
fijaremos en la estructura o firma del método sea igual a la de la clase padre. En este sentido,
la clase hija:
• Debe tener la misma firma que la clase padre.
• Debe tener el mismo nombre, mismo número de argumentos y mismo tipo de retorno
(o al menos un subtipo de este).
• No puede tener un nivel de acceso más restrictivo que la clase padre, es decir, si el
modo de acceso en la clase padre es protected, en la clase hija no puede ser private.
• No se pueden sobrescribir métodos static ni final, ya que static representa métodos
globales y final métodos constantes.
Ejemplo: continuando con nuestra clase Coche que heredaba los métodos de la clase padre
Vehículo (arrancar, acelerar, frenar). Imaginemos que el método arrancar de la clase padre
hace que se imprima la frase “Arrancar Vehiculo”, pero nosotros queremos especificar para
nuestra clase el tipo de vehículo que arrancamos (coche).
Vemos como sería…
CLASE PADRE
Public class Vehiculo{
public void arrancar(){
System.out.println(“Arrancar el vehiculo");
}
}
CLASE HIJA
Ten en cuenta que… Cuando sobrescribamos métodos debemos escribir la anotación @Override
encima del método de la clase hija que queramos sobrescribir.
9
© Accenture todos los derechos reservados Confidencial
1. PROGRAMACIÓN ORIENTADA A OBJETOS (PARTE I)
1.4. POLIMORFISMO
Ejemplo:
No olvides que… Como ya vimos en la herencia, en cada clase podemos especializar más el
objeto: añadiendo nuevos atributos o métodos, haciendo de esta manera que se comporte de
diferente manera en cada caso.
10
POLIMORFISMO
Sobrecarga Sobrescritura
ENLACE ESTÁTICO
Ejemplo:
public class Vehiculo {
public void arrancar() {
System.out.println(“Arrancando el vehículo”);
}
public void arrancar(String modelo) {
System.out.println(“Arrancando el ” + modelo);
}
/*Aquí ya tenemos el polimorfismo en tiempo de compilación porque, al sobrecargar
los métodos, ya sabemos que dependiendo de la firma tendrá un comportamiento
distinto */
}
11
ENLACE DINÁMICO
Ejemplo:
public class Vehiculo {
public void arrancar() {
System.out.println(“Arrancando el vehículo”);
}
}
12
13