1. 1. Utilización Herencia
Es importante recordar que la herencia es un paradigma de la programación orientada
a objetos, que tiene como principal objetivo la reutilización.
Para cumplir con la reutilización la herencia determina que el código escrito en una clase
padre puede ser utilizado por todas su clases hijas, evitando que este código se
repita cada vez.
Cuando se requiere que un objeto herede los atributos y los métodos de una super clase
se utiliza la palabra reservada extends.
Para ejemplificar su utilización, se empleará la herencia entre las
clases Vehiculo como clase padre y VehiculoHibrido como clase hija, la
herencia en lenguaje natural se expresa como "es un " así un
VehiculoHibrido es un Vehiculo
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class Vehiculo {
private String color;
private String placa;
private int cilindraje;
private int velocidad;
private String marchaActual;
public void acelerar(int valorIncrementoDeVelocidad){
velocidad=velocidad+valorIncrementoDeVelocidad;
}
public void frenar(int valorDecrementoDeVelocidad){
velocidad=velocidad-valorDecrementoDeVelocidad;
}
public void cambiarDeMarcha(String marchaNueva){
marchaActual=marchaNueva;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getPlaca() {
return placa;
}
public void setPlaca(String placa) {
this.placa = placa;
}
public int getCilindraje() {
return cilindraje;
}
2. 36
37
38
39
40
41
42
43
44
45
46
47
public void setCilindraje(int cilindraje) {
this.cilindraje = cilindraje;
}
public String getMarchaActual() {
return marchaActual;
}
public void setMarchaActual(String marchaActual) {
this.marchaActual = marchaActual;
}
}
Figura 1.1: Superclass
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class VehiculoHibrido extends Vehiculo {
private int cargaBateria;
public VehiculoHibrido() {
super();
}
public void frenar(int valorDecrementoDeVelocidad){
super.frenar(valorDecrementoDeVelocidad);
this.cargaBateria++;
}
public int getCargaBateria() {
return cargaBateria;
}
public void setCargaBateria(int cargaBateria) {
this.cargaBateria = cargaBateria;
}
}
Figura 1.2: Subclase
Para llamar explicitamente a algún miembro de la clase Padre (Vehiculo), desde la clase
hija (VehiculoHibrido), se puede utilizar la palabra reservada super, como se pudo
apreciar en la figura anterior.
Adicionalmente se debe destacar que en el constructor de la clase hija, la primera línea
que debe ser llamada es el constructor de la clase padre; denotada
porsuper(<argumentos>) donde argumentos son el número de parámetros que tiene
el constructor de la clase Vehiculo.
3. Recordemos que la
Herencia es uno de los 3
paradigmas de la
Programación Orientada
a Objetos y que su
principal objetivo es la
reutilización, mediante
la creación de clases
padres e hijas.
1.1 Sobreescritura Métodos
Muchas veces en las clases hijas, la utilización de un método heredado de la clase padre
no cumple con la totalidad de los requerimientos en la clase hija, así en el caso del
ejemplo entre el Vehiculo y el VehiculoHibrido, en el método frenar se le
agrega la funcionalidad de incremento de la carga en la batería. En estas
situaciones se aplica la técnica conocida como sobreescritura de
métodos, la cual como se mencionó consiste en cambiar total o
parcialmente el comportamiento de un método heredado.
La sobrevescritura debe cumplir con las siguientes condiciones
• El tipo de retorno debe ser el mismo o un subtipo del declarado originalmente.
• La firma del método (número y tipo de argumentos) no se puede modificar.
• El nivel de acceso no debe ser más restrictivo, por ejemplo si es public no puede ser
private.
• No se puede sobreescribir métodos marcados como static o final.
La sobreescritura es una de las formas de
implementar el segundo paradigma orientada a
objetos El Polimorfismo, el cual consiste en
utilizar el mismo nombre de método pero con
distinta implementación (diferente funcionalidad)
1.1 Sobrecarga de Métodos
La sobrecarga de métodos es la segunda forma de aplicar el polimorfismo y se puede
aplicar de las siguiente maneras:
• Modificando el tipo de datos de los parámetros de un método, así si el método
frenar recibe un parámetro del tipo entero, en el caso de una sobrecarga del
método puede cambiar y recibir un parámetro tipo long.
public void frenar(long valor)
• Modificando el número de parámetros que recibe un método,
4. public void frenar(int valorDecrementoDeVelocidad, intvalorCargaBateria)
public void frenar()
• Modificando el tipo de retorno del método en conjunto con el
número de parámetros o el tipo de datos
public double frenar(){
return 0d ;
}
• Un método puede ser sobrecargado en la misma clase o subclase.
La sobrecarga es otra forma de implementar el
concepto de Polimorfismo, en este caso en específico
el nombre del método se mantiene pero los
parámetros varian.
Video 1.1 Utilización de Herencia
https://www.youtube.com/watch?v=4O0m5DRZwQg
2. Interface
Las interfaces, por lo general, son como “contratos de negocio” en los cuales existen
dos partes: el contratante y el(los) contratado(s), quien deben cumplir todas las
reglas o normas definidas de manera obligatoria. Lo fundamental es que cumplan
todas y cada una de las reglas definidas.
En lo que respecta a Java, una interfaz es un tipo referencial similar a una Clase, pero
con ciertas diferencias que se denotan a continuación:
• Las interfaces no pueden ser instanciadas, solo pueden ser implementadas por
una clase o extendidas por otras interfaces.
• Todos los atributos definidos en una interface son constantes.
• Solo se pueden definir métodos abstractos (no tienen cuerpo); son solo
definiciones de métodos.
5. Para crear una interfaz se utiliza la palabra reservada interface, y para realizar su
implementación se utiliza la palabra reservada implements. Cabe destacar que a través
de las interfaces se puede simular la herencia múltiple, debido a que una clase puede
implementar más de una interface. A continuación se muestra la creación e
implementación de un contrato de negocio para Usuario.
?
1
2
3
4
5
6
7
8
9
10
11
package ec.edu.cec.epn.java.fun.semana3;
public interface IAdminUsuario {
boolean verificarCredenciales(String usuario, String contrasenia);
public void resetearContrasenia(String mail);
String encriptarContrasenia(String contrasenia);
}
Figura 2.1: Interface
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package ec.edu.cec.epn.java.fun.semana3;
/**
* Clase que implementa la interfaz IAdminUsuario y las correspondientes
operaciones
* @author Pablo
*
*/
public class AdminUsuario implements IAdminUsuario {
@Override
public boolean verificarCredenciales(String usuario, String contrasenia)
{
// TODO Auto-generated method stub
return false;
}
@Override
public void resetearContrasenia(String mail) {
// TODO Auto-generated method stub
}
@Override
public String encriptarContrasenia(String contrasenia) {
// TODO Auto-generated method stub
return null;
}
}
Figura 2.2: Implementación Interfaz
6. Haciendo la similitud con un contrato, cada uno de
los métodos de la interface se constituyen en las
“clausulas del contrato” y los atributos en los
valores definidos, que una vez escritos en el
contrato no son negociables ni modificables
https://www.youtube.com/watch?v=c9q5lorCrD8
Video 2.1 Utilización de Polimorfismo (Interface)
3. Clases Abstractas
Una clase abstracta se identifica con la palabra reservada abstract . Se trata de un tipo
especial de clase, su principal característica es la capacidad de defnir un contrato de
funcionalidad (como una interface) y adicionalmente métodos con cuerpo o
implementación (como una clase normal). Se utiliza principalmente para implementar
conceptos de herencia y reutilización.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package ec.edu.cec.epn.java.fun.semana3;
public abstract class Fruta {
private String sabor;
private String consistencia;
private String color;
public abstract String getConsistencia();
public abstract String getColor();
public String getSabor() {
return sabor;
}
public void setSabor(String sabor) {
this.sabor = sabor;
7. 17
18
19
20
21
22
23
24
25
26
27
}
public void setConsistencia(String consistencia) {
this.consistencia = consistencia;
}
public void setColor(String color) {
this.color = color;
}
}
Figura 3.1: Clase abstracta
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package ec.edu.cec.epn.java.fun.semana3;
public class Manzana extends Fruta{
@Override
public String getConsistencia() {
return "arenosa";
}
@Override
public String getColor() {
return "roja";
}
public String getPaisProcedencia(){
return "Ecuador";
}
}
Figura 3.2: Clase concreta
Cabe destacar que una clase abstract solo se puede heredar, nunca instanciar.
Esto significa que no se puede definir un constructor e invocarlo:
Fruta fruta= new Fruta();//imposible instanciar una clase abstracta
Casting
Es el proceso que consiste en convertir un tipo de dato a otro. Java maneja cuatro tipos
de casting o conversión:
Para estos ejemplos consideremos la clase Padre Persona y la clase hija Empleado
• Implicito.- Sucede cuando un tipo de dato con menor jerarquía es promovido a un tipo de dato con
mayor jerarquía, pero sin realizar ninguna operación adicional. En el caso de Objetos sucede
exactamente lo mismo, pero con la diferencia que el un objeto debe de heredar del otro. Por ejemplo
tenemos dos Clases: Persona que es la clase padre yEmpleado que es la clase hija; es decir, hereda
de Persona. Entonces al hacer el casting implicito ,la conversión de un Empleado a Persona es
automático como se muestra continuación:
8. Figura 6.1: Casting Implicito
Este tipo de casting no presenta ningún inconveniente ya que si
consideramos que un Empleado es definitivamente una Persona
• Explicito.- Sucede cuando un tipo de dato con mayor jerarquía es promovido a un tipo de dato con
menor jerarquía, pero necesitamos cambiarle expllícitamente. Se diferencia del casting implicito
porque no aplica con objetos. A continuación se muestra un ejemplo:
Figura 6.2 Casting Explícito
Este casting puede fallar ya que una persona no necesariamente es un Empleado.
• Autoboxing.- Permite realizar la conversión automática de tipos de datos primitivos a sus respectivos
Wrapper. Por ejemplo: de int a Integer, de double a Double etc.
Figura 6.3: Autoboxing
Un Wrapper es una clase que permite trabajar con los tipos de datos primitivos como si
se trataran de objetos.
• Inboxing.- Es la operación inversa del autoboxing. Permite la conversión automática de los diferentes
Wrappers a tus datos primitivos; por ejemplo: de Integer a int
9. Figura 6.4: Inboxing
4. Innerclass
Una innerclass es una clase que está definida dentro de otra clase; es decir, como una
clase interna, razón por la cual es tratada como un atributo más.
Cabe aclarar que una Innerclass puede tener cualquier modificador de acceso excepto
public,ya que en una archivo .java solamente puede haber una clase pública.
4.1 Creación InnerClass
Se puede crear una Innerclass de tres formas:
• local-Innerclass.- Consiste en declarar la clase dentro del cuerpo de un método,
con lo que la clase solo existe en la llamada del método y no puede tener ningún
modificador de acceso. Este tipo de creación es muy recomendado para
mecanismos de seguridad, A continuación se puede apreciar un ejemplo:
Figura 4.1: Local Innerclass
• anonymous-Innerclass.- Consiste en declarar la clase dentro del cuerpo de un
método, pero sin nombrarlo; es decir, crearlo en caliente el mismo momento de
utilizarla. A continuación se puede apreciar un ejemplo:
Figura 4.2: Innerclass Anónima
• nested-Innerclass.- Consiste en declarar la clase fuera de un método como un
miembro más; esta es la forma más común de utilización. A continuación se
puede apreciar un ejemplo:
10. Figura 4.3: Nested Innerclass
4.2 Utilización
Para poder utilizar una Innerclass, debemos identificar el modo en que fue declarado.
El más común es a nivel de miembro ya que las otras Innerclasses declaradas a nivel de
método solo existen dentro del mismo. Para crear una instancia de Innerclass lo
hacemos a través de una instancia de la clase contenedora (Outer Class), siempre y
cuando la Innerclass no sea estática o privada, como se muestra a continuación:
Figura 4.4: Utilización Innerclass