7.9 KiB
Java Polimorfismo, Entendiendo Herencia e Interfaces
Herencia
Extendiendo la funcionalidad de la clase Funcionario a la nueva clase Gerente,
heradando métodos y atributos de la case padre (Funcionario), utilzando la palabra
reservada extends
. Reutilización de código.
Palabras reservadas this
y super
.
- this: este keyword se refiere al objeto catuan en un método o
constructor. El uso más común de este término es eliminnar la ambiguedad entre
los atributos de clase y los parámetros con el mismo nombre. Además sirve para:
- Invocar al constructor de la clase actual.
- Invocar al método de clase actual.
- Devolver el objeto de la clase actual.
- Pasar un argumento en la llamada a un método.
- Pasar un arg. en la llamada al constructor.
- super: este keyword se refiere a objetos de la superclase (madre). Se
utiliza para llamar a los métodos de la superclase y para acceder al constructor
de esta. Su función más común es eliminar la ambiguedad entre superclases y
subclases que tienen métodos con el mismo nombre. Utilizada para:
super
:- Referirse a la variable de instancia de la clase inmediatamente superior.
- Invocar métodos de la clase inmediatamente superior (clase madre).
super()
:- Invocar al constructor de la clase inmediatamente superior (clase madre).
Modificadores de acceso
Los modificadores de acceso o accesibilidad son algunas palabras claves utilizadas en el lenguaje Java para definir el nivel de accesibilidad que los elementos de una clase (atributos y métodos) e incluso la propia clase puede tener los mismos elementos de otra clase.
-
Public: Este es el modificador menos restrictivo de todos. De esta manera, cualquier componente puede acceder a los miembros de la clase, las clases y las interfaces.
-
Protected: Al usar este modificador de acceso, los miembros de la clase y las clases son accesibles para otros elementos siempre que están dentro del mismo package o, si pertenecen a otros packages, siempre que tengan una relación extendida (herencia), es decir, las clases secundarias pueden acceder a los miembros de su clase principal (o clase de abuelos, etc.).
-
Private: Este es el modificador de acceso más restrictivo de todos. Solo se puede acceder a los miembros definidos como privados desde dentro de la clase y desde ningún otro lugar, independientemente del paquete o la herencia.
Java doc modificadores de acceso
Sobrecarga de metodo
public boolean autenticar(int password) {
if (this.password == contraseña) {
return true;
} else {
return false;
}
}
// Nuevo método, recibiendo dos parámetros
public boolean autenticar(String login, int password) {
...
}
Se ha creado una nueva versión del método autenticar. Ahora tenemos dos métodos de autenticar en la misma clase que varían en el número o tipo de parámetros. Esto se llama sobrecarga de métodos.
La sobrecarga no tiene en cuenta la visibilidad o retorno del método, solo los parámetros y no depende de la herencia.
Notas:
- La clase madre es llamada de super o base class.
- La clase hija también es llamada de sub class.
- Aumentar la visibilidad de un miembro (atributo, método) a través de protected.
- Acceder o llamar un miembro (atributo, método) a través de super.
Entendiendo Polimorfismo
Clase Madre
public class Vehiculo {
public void encender() {
System.out.println("Enciendiendo vehículo");
}
}
Clases Hijas
public class Automovil extends Vehiculo {
public void encender() {
System.out.println("Enciendiendo automovil");
}
}
public class Motocicleta extends Vehiculo {
public void encender() {
System.out.println("Enciendiendo motocicleta");
}
}
Main
public class TestVehiculos {
public static void main(String[] args) {
Vehiculo m = new Motocicleta();
m.encender();
Vehiculo c = new Automovil();
c.encender();
}
}
Salida
Enciendiendo motocicleta
Enciendiendo automovil
Notas
- Los objetos no cambian de tipo.
- La referencia puede cambiar, y ahí es donde entra el polimorfismo.
- El polimorfismo permite utilizar referencias más genéricas para comunicarse con un objeto.
- El uso de referencias más genéricas permite desacoplar sistemas.
- Uso de la anotación
@Override
. - Los constructores no se heredan.
- Se puede llamar a un constructor de clase madre mediante
super()
.
Clases abstractas e interfaces
Interfáz | Clase Abstracta |
---|---|
Keyword implements |
Keyword extends |
Admite herencia múltiple | No admite herencia múltiple |
Proporciona una abstracción absoluta y no puede tener implementaciones de métodos | Puede tener métodos con implementaciones |
No posee constructor | Posee constructor |
No puede tener modificador de acceso, todos los accesos con públicos | Puede tener modificadores de acceso |
Sus miembros no pueden ser static |
Solo los miembros completamenten abstractos pueden ser static |
No hay herencia múltiple en Java, Las interfaces son una alternativa a la herencia con respecto al polimorfismo.
Java util
Ejemplos de clases abstractas e interfaces
Clase Abstracta Funcionario
public abstract class Funcionario {
private String nombre;
private String documento;
private Double salario;
private int tipo;
public Funcionario() {
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getDocumento() {
return documento;
}
public void setDocumento(String documento) {
this.documento = documento;
}
public Double getSalario() {
return salario;
}
public void setSalario(Double salario) {
this.salario = salario;
}
public int getTipo() {
return tipo;
}
public void setTipo(int tipo) {
this.tipo = tipo;
}
public abstract double getBonificacion();
}
Implementada por la clase Gerente
public class Gerente extends Funcionario implements Autenticable {
private AutenticacionUtil util;
public Gerente() {
this.util = new AutenticacionUtil();
}
public double getBonificacion() {
return super.getSalario() + (this.getSalario() * 0.5);
}
@Override
public void setClave(String clave) {
this.util.setClave(clave);
}
@Override
public boolean inicioSesion(String clave) {
return this.util.inicioSesion(clave);
}
}
Que implementa la Interfáz Autenticable
public interface Autenticable {
public void setClave(String clave);
public boolean inicioSesion(String clave);
}
Utilización de clase utilitaria Autenticable
public class AutenticacionUtil {
private String clave;
public boolean inicioSesion(String clave) {
return this.clave == clave;
}
public void setClave(String clave) {
this.clave = clave;
}
}