Java Polimorfismo: Herencia e Interfaces
This commit is contained in:
parent
0f56c54d51
commit
a5f5462502
8
.gitignore
vendored
8
.gitignore
vendored
@ -4,3 +4,11 @@ test/
|
||||
out/
|
||||
*.class
|
||||
*.iml
|
||||
.metadata/
|
||||
bin/
|
||||
.settings/
|
||||
.classpath
|
||||
.project
|
||||
*.uml
|
||||
*.uxf
|
||||
*.umlcd
|
||||
|
@ -6,3 +6,8 @@ Tablero en [trello](https://trello.com/b/dSotNCw1/g5-formaci%C3%B3n-java)
|
||||
Java [primeros pasos](./primeros_pasos.md)
|
||||
- [Curso](https://app.aluracursos.com/course/java-parte2-introduccion-orientada-objetos)
|
||||
Java [orientación a objetos](./orientacion_obj.md)
|
||||
- [Curso](https://app.aluracursos.com/course/java-parte-3-entendiendo-herencia-interfaces)
|
||||
Entendiendo [Herencia e Interfaces](./herencia_interfaces.md)
|
||||
- Extra [Enums y anotaciones](./enums_anotaciones_java.md) java
|
||||
- [Curso](https://app.aluracursos.com/course/java-excepciones) Lanzar y controlar
|
||||
[Excepciones](./excepciones.md)
|
||||
|
10
008_java_oo/eclipse/anotaciones/src/EdadMinima.java
Normal file
10
008_java_oo/eclipse/anotaciones/src/EdadMinima.java
Normal file
@ -0,0 +1,10 @@
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.FIELD)
|
||||
public @interface EdadMinima {
|
||||
public int valor();
|
||||
}
|
14
008_java_oo/eclipse/anotaciones/src/TestCrearUsuario.java
Normal file
14
008_java_oo/eclipse/anotaciones/src/TestCrearUsuario.java
Normal file
@ -0,0 +1,14 @@
|
||||
import java.time.LocalDate;
|
||||
import java.time.Month;
|
||||
|
||||
public class TestCrearUsuario {
|
||||
public static void main(String[] args) {
|
||||
Usuario usuario1 = new Usuario("Maria", "123456789", LocalDate.of(1995, Month.MARCH, 14));
|
||||
Usuario usuario2 = new Usuario("Mario", "987654321", LocalDate.of(2020, Month.MARCH, 14));
|
||||
//System.out.println(Usuario.usuarioValido(usuario1));
|
||||
System.out.println(Validador.validador(usuario1));
|
||||
//System.out.println(Usuario.usuarioValido(usuario2));
|
||||
System.out.println(Validador.validador(usuario2));
|
||||
|
||||
}
|
||||
}
|
53
008_java_oo/eclipse/anotaciones/src/Usuario.java
Normal file
53
008_java_oo/eclipse/anotaciones/src/Usuario.java
Normal file
@ -0,0 +1,53 @@
|
||||
import java.time.LocalDate;
|
||||
import java.time.Period;
|
||||
|
||||
public class Usuario {
|
||||
|
||||
private String nombre;
|
||||
private String identidad;
|
||||
@EdadMinima(valor=10)
|
||||
private LocalDate fechaNacimiento;
|
||||
|
||||
public Usuario(String nombre, String identidad, LocalDate fechaNacimiento) {
|
||||
this.nombre = nombre;
|
||||
this.identidad = identidad;
|
||||
this.fechaNacimiento = fechaNacimiento;
|
||||
}
|
||||
|
||||
public String getNombre() {
|
||||
return nombre;
|
||||
}
|
||||
|
||||
public void setNombre(String nombre) {
|
||||
this.nombre = nombre;
|
||||
}
|
||||
|
||||
public String getIdentidad() {
|
||||
return identidad;
|
||||
}
|
||||
|
||||
public void setIdentidad(String identidad) {
|
||||
this.identidad = identidad;
|
||||
}
|
||||
|
||||
public LocalDate getFechaNacimiento() {
|
||||
return fechaNacimiento;
|
||||
}
|
||||
|
||||
public void setFechaNacimiento(LocalDate fechaNacimiento) {
|
||||
this.fechaNacimiento = fechaNacimiento;
|
||||
}
|
||||
|
||||
public static boolean usuarioValido(Usuario usuario) {
|
||||
if (!usuario.getNombre().matches("[a-zA-Záàâãéèêíïóôõöúçñ\\s]+")) {
|
||||
System.out.println("Fail RegexNombre");
|
||||
return false;
|
||||
}
|
||||
if (!usuario.getIdentidad().matches("[^0-9]+")) {
|
||||
System.out.println("Fail RegexIdentidad");
|
||||
return false;
|
||||
}
|
||||
return Period.between(usuario.getFechaNacimiento(), LocalDate.now()).getYears() >= 18;
|
||||
}
|
||||
|
||||
}
|
22
008_java_oo/eclipse/anotaciones/src/Validador.java
Normal file
22
008_java_oo/eclipse/anotaciones/src/Validador.java
Normal file
@ -0,0 +1,22 @@
|
||||
import java.lang.reflect.Field;
|
||||
import java.time.LocalDate;
|
||||
import java.time.Period;
|
||||
|
||||
public class Validador {
|
||||
public static <T> boolean validador(T objeto) {
|
||||
Class<?> clase = objeto.getClass();
|
||||
for (Field field : clase.getDeclaredFields()) {
|
||||
if (field.isAnnotationPresent(EdadMinima.class)) {
|
||||
EdadMinima edadMinima = field.getAnnotation(EdadMinima.class);
|
||||
try {
|
||||
field.setAccessible(true);
|
||||
LocalDate fechaNacimiento = (LocalDate) field.get(objeto);
|
||||
return Period.between(fechaNacimiento, LocalDate.now()).getYears() >= edadMinima.valor();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public class Administrador extends Funcionario implements Autenticable {
|
||||
|
||||
private AutenticacionUtil util;
|
||||
|
||||
public Administrador() {
|
||||
this.util = new AutenticacionUtil();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getBonificacion() {
|
||||
return this.getSalario();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setClave(String clave) {
|
||||
this.util.setClave(clave);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inicioSesion(String clave) {
|
||||
return this.util.inicioSesion(clave);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public interface Autenticable {
|
||||
|
||||
public void setClave(String clave);
|
||||
|
||||
public boolean inicioSesion(String clave);
|
||||
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public class AutenticacionUtil {
|
||||
|
||||
private String clave;
|
||||
|
||||
public boolean inicioSesion(String clave) {
|
||||
return this.clave == clave;
|
||||
}
|
||||
|
||||
public void setClave(String clave) {
|
||||
this.clave = clave;
|
||||
}
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public class Cliente implements Autenticable {
|
||||
private String nombre;
|
||||
private String documento;
|
||||
private String telefono;
|
||||
private AutenticacionUtil util;
|
||||
|
||||
public Cliente() {
|
||||
this.util = new AutenticacionUtil();
|
||||
}
|
||||
|
||||
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 String getTelefono() {
|
||||
return telefono;
|
||||
}
|
||||
|
||||
public void setTelefono(String telefono) {
|
||||
this.telefono = telefono;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setClave(String clave) {
|
||||
this.util.setClave(clave);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inicioSesion(String clave) {
|
||||
return this.util.inicioSesion(clave);
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public class Contador extends Funcionario {
|
||||
|
||||
@Override
|
||||
public double getBonificacion() {
|
||||
return 200.0;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public class ControlBonificacion {
|
||||
private double suma_bonific;
|
||||
|
||||
public double registrarSalario(Funcionario funcionario) {
|
||||
System.out.println(this.suma_bonific);
|
||||
return this.suma_bonific += funcionario.getBonificacion();
|
||||
}
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public abstract class Cuenta {
|
||||
protected double saldo;
|
||||
private int agencia;
|
||||
private int numero;
|
||||
private Cliente titular = new Cliente();
|
||||
private static int contador = 0;
|
||||
|
||||
public Cuenta(int agencia, int numero) {
|
||||
if (agencia <= 0) {
|
||||
System.out.println("No se permiten valores negativos");
|
||||
this.agencia = 1;
|
||||
} else {
|
||||
this.agencia = agencia;
|
||||
}
|
||||
this.numero = numero;
|
||||
contador++;
|
||||
System.out.println("Cuentas creadas: "+contador);
|
||||
}
|
||||
|
||||
public abstract void depositar(double valorDeposito);
|
||||
|
||||
public boolean retirar(double valorRetiro) {
|
||||
if (this.saldo >= valorRetiro) {
|
||||
this.saldo -= valorRetiro;
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean transferir(double montoTransferencia, Cuenta cuenta){
|
||||
if (this.retirar(montoTransferencia)) {
|
||||
cuenta.depositar(montoTransferencia);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public double getSaldo() {
|
||||
return this.saldo;
|
||||
}
|
||||
|
||||
public int getAgencia(){
|
||||
return this.agencia;
|
||||
}
|
||||
|
||||
public void setNumero(int numero){
|
||||
this.numero = numero;
|
||||
}
|
||||
|
||||
public int getNumero(){
|
||||
return this.numero;
|
||||
}
|
||||
|
||||
public void setTitular(Cliente titular){
|
||||
this.titular = titular;
|
||||
}
|
||||
|
||||
public Cliente getTitular(){
|
||||
return titular;
|
||||
}
|
||||
|
||||
public static int getContador(){
|
||||
return Cuenta.contador;
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public class CuentaAhorro extends Cuenta {
|
||||
public CuentaAhorro(int agencia, int numero) {
|
||||
super(agencia, numero);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void depositar(double valorDeposito) {
|
||||
this.saldo += valorDeposito;
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public class CuentaCorriente extends Cuenta {
|
||||
public CuentaCorriente(int agencia, int numero) {
|
||||
super(agencia, numero);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean retirar(double valorRetiro) {
|
||||
double comision = 0.2;
|
||||
System.out.println("Ejecutando retiro sobreescrito");
|
||||
return super.retirar( valorRetiro + comision );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void depositar(double valorDeposito) {
|
||||
this.saldo += valorDeposito;
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
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();
|
||||
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public class Gerente extends Funcionario implements Autenticable {
|
||||
|
||||
private AutenticacionUtil util;
|
||||
|
||||
public Gerente() {
|
||||
this.util = new AutenticacionUtil();
|
||||
}
|
||||
|
||||
//public void setNombre(String nombre){
|
||||
// super.setNombre(nombre);
|
||||
//}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public class SistemaInterno {
|
||||
|
||||
private String clave = "12345";
|
||||
|
||||
public boolean autentica(Autenticable autenticable) {
|
||||
|
||||
boolean autorizado = autenticable.inicioSesion(clave);
|
||||
if (autorizado) {
|
||||
System.out.println("Sesion iniciada");
|
||||
return true;
|
||||
} else {
|
||||
System.out.println("No autorizado");
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public class TestControlBonificacion {
|
||||
public static void main(String[] args) {
|
||||
Funcionario diego = new Contador();
|
||||
diego.setSalario(2000.0);
|
||||
|
||||
Gerente jimena = new Gerente();
|
||||
jimena.setSalario(10000.0);
|
||||
|
||||
ControlBonificacion controlBonificacion = new ControlBonificacion();
|
||||
System.out.println(controlBonificacion.registrarSalario(diego));
|
||||
System.out.println(controlBonificacion.registrarSalario(jimena));
|
||||
|
||||
Contador alex = new Contador();
|
||||
alex.setSalario(5000.0);
|
||||
System.out.println(controlBonificacion.registrarSalario(alex));
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public class TestCuentas {
|
||||
public static void main(String[] args) {
|
||||
CuentaCorriente cta_corriente = new CuentaCorriente(1, 1);
|
||||
CuentaAhorro cta_ahorro = new CuentaAhorro(2, 3);
|
||||
cta_corriente.depositar(2000.0);
|
||||
cta_corriente.transferir(1000.0, cta_ahorro);
|
||||
System.out.println("Saldo Cuenta de Ahorro : " + cta_ahorro.getSaldo());
|
||||
System.out.println("Saldo Cuenta de Corriente: " + cta_corriente.getSaldo());
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public class TestFuncionario {
|
||||
public static void main(String[] args) {
|
||||
Funcionario diego = new Contador();
|
||||
diego.setNombre("Diego");
|
||||
diego.setDocumento("123456789-F");
|
||||
diego.setSalario(2000.0);
|
||||
System.out.println("Funcionario: "+diego.getNombre()+" - "+diego.getSalario()+" - "+diego.getDocumento());
|
||||
System.out.println(diego.getBonificacion());
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public class TestGerente {
|
||||
public static void main(String[] args) {
|
||||
Gerente gerente = new Gerente();
|
||||
gerente.setNombre("pepe");
|
||||
gerente.setSalario(5000.0);
|
||||
gerente.setDocumento("987654321-D");
|
||||
System.out.println(gerente.getNombre()+" - "+
|
||||
gerente.getDocumento()+" - "+
|
||||
gerente.getSalario()+" - "+
|
||||
gerente.getBonificacion());
|
||||
|
||||
gerente.setClave("AluraLatam");
|
||||
System.out.println(gerente.inicioSesion("AluraLatam"));
|
||||
System.out.println(gerente.inicioSesion("ClaveErronea"));
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public class TestReferencias {
|
||||
public static void main(String[] args) {
|
||||
|
||||
// El elemento mas genérico puede ser adaptado al elemento mas específico:
|
||||
// Todos los 'gerentes' son 'funcionarios', pero no todos los 'funcionarios'
|
||||
// son 'gerentes'
|
||||
|
||||
//Funcionario funcionario = new Funcionario();
|
||||
Funcionario funcionario = new Gerente();
|
||||
funcionario.setNombre("Diego");
|
||||
|
||||
Gerente gerente = new Gerente();
|
||||
gerente.setNombre("Jimena");
|
||||
|
||||
funcionario.setSalario(2000.0);
|
||||
gerente.setSalario(10000.0);
|
||||
|
||||
//funcionario.inicioSesion("no_es_posible");
|
||||
System.out.println(gerente.inicioSesion("askldfhkasjdhf"));
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package bytebank_heredado;
|
||||
|
||||
public class TestSistemaInterno {
|
||||
public static void main(String[] args) {
|
||||
SistemaInterno sistema = new SistemaInterno();
|
||||
Gerente gerente1 = new Gerente();
|
||||
Administrador admin1 = new Administrador();
|
||||
System.out.println(sistema.autentica(gerente1));
|
||||
System.out.println(sistema.autentica(admin1));
|
||||
//sistema.autentica(admin1);
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package colores;
|
||||
|
||||
public class Colores {
|
||||
// Colores ANSI
|
||||
public static final String RESET = "\u001B[0m";
|
||||
public static final String BLACK = "\u001B[30m";
|
||||
public static final String RED = "\u001B[31m";
|
||||
public static final String GREEN = "\u001B[32m";
|
||||
public static final String YELLOW = "\u001B[33m";
|
||||
public static final String BLUE = "\u001B[34m";
|
||||
public static final String PURPLE = "\u001B[35m";
|
||||
public static final String CYAN = "\u001B[36m";
|
||||
public static final String WHITE = "\u001B[37m";
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println(RED + "Este texto es rojo" + RESET);
|
||||
System.out.println(GREEN + "Este texto es verde" + RESET);
|
||||
System.out.println(BLUE + "Este texto es azul" + RESET);
|
||||
System.out.println(YELLOW + "Este texto es amarillo" + RESET);
|
||||
System.out.println(PURPLE + "Este texto es morado" + RESET);
|
||||
System.out.println(CYAN + "Este texto es cian" + RESET);
|
||||
System.out.println(WHITE + "Este texto es blanco" + RESET);
|
||||
}
|
||||
}
|
5
008_java_oo/eclipse/bytebank_heredado/src/enums/Dia.java
Normal file
5
008_java_oo/eclipse/bytebank_heredado/src/enums/Dia.java
Normal file
@ -0,0 +1,5 @@
|
||||
package enums;
|
||||
|
||||
public enum Dia {
|
||||
LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package enums;
|
||||
|
||||
public class Principal {
|
||||
|
||||
public static void main(String[] args) {
|
||||
for (Dia dia : Dia.values()) {
|
||||
System.out.println("El dia de la semana es: "+dia);
|
||||
}
|
||||
Dia domingo = Dia.DOMINGO;
|
||||
System.out.println(domingo.name());
|
||||
System.out.println(domingo.ordinal());
|
||||
System.out.println(domingo.toString());
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
/**
|
||||
*
|
||||
*/
|
||||
module bytebank_heredado {
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package vehiculos;
|
||||
|
||||
public class Automovil extends Vehiculo {
|
||||
public void encender() {
|
||||
System.out.println("Enciendiendo automovil");
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package vehiculos;
|
||||
|
||||
public class Motocicleta extends Vehiculo {
|
||||
public void encender() {
|
||||
System.out.println("Enciendiendo motocicleta");
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package vehiculos;
|
||||
|
||||
public class TestVehiculos {
|
||||
public static void main(String[] args) {
|
||||
Vehiculo m = new Motocicleta();
|
||||
m.encender();
|
||||
Vehiculo c = new Automovil();
|
||||
c.encender();
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package vehiculos;
|
||||
|
||||
public class Vehiculo {
|
||||
public void encender() {
|
||||
System.out.println("Enciendiendo vehículo");
|
||||
}
|
||||
}
|
150
008_java_oo/enums_anotaciones_java.md
Normal file
150
008_java_oo/enums_anotaciones_java.md
Normal file
@ -0,0 +1,150 @@
|
||||
# Enums
|
||||
|
||||
Tipo de datos especiales donde una variable puede contener el valor de un grupo
|
||||
de constantes predefinidas.
|
||||
|
||||
- Java [enum](https://www.youtube.com/watch?v=EoPvlE85XAQ)
|
||||
|
||||
```java
|
||||
public enum Dia {
|
||||
LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO
|
||||
}
|
||||
```
|
||||
|
||||
```java
|
||||
public class Principal {
|
||||
|
||||
public static void main(String[] args) {
|
||||
for (Dia dia : Dia.values()) {
|
||||
System.out.println("El dia de la semana es: "+dia);
|
||||
}
|
||||
Dia domingo = Dia.DOMINGO;
|
||||
System.out.println(domingo.name());
|
||||
System.out.println(domingo.ordinal());
|
||||
System.out.println(domingo.toString());
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
# Anotaciones
|
||||
|
||||
Alura [blog](https://www.aluracursos.com/blog/crear-anotaciones-en-java)
|
||||
|
||||
Clase [Usuario](./eclipse/anotaciones/src/Usuario.java)
|
||||
|
||||
```java
|
||||
import java.time.LocalDate;
|
||||
import java.time.Period;
|
||||
|
||||
public class Usuario {
|
||||
|
||||
private String nombre;
|
||||
private String identidad;
|
||||
@EdadMinima(valor=10)
|
||||
private LocalDate fechaNacimiento;
|
||||
|
||||
public Usuario(String nombre, String identidad, LocalDate fechaNacimiento) {
|
||||
this.nombre = nombre;
|
||||
this.identidad = identidad;
|
||||
this.fechaNacimiento = fechaNacimiento;
|
||||
}
|
||||
|
||||
public String getNombre() {
|
||||
return nombre;
|
||||
}
|
||||
|
||||
public void setNombre(String nombre) {
|
||||
this.nombre = nombre;
|
||||
}
|
||||
|
||||
public String getIdentidad() {
|
||||
return identidad;
|
||||
}
|
||||
|
||||
public void setIdentidad(String identidad) {
|
||||
this.identidad = identidad;
|
||||
}
|
||||
|
||||
public LocalDate getFechaNacimiento() {
|
||||
return fechaNacimiento;
|
||||
}
|
||||
|
||||
public void setFechaNacimiento(LocalDate fechaNacimiento) {
|
||||
this.fechaNacimiento = fechaNacimiento;
|
||||
}
|
||||
|
||||
public static boolean usuarioValido(Usuario usuario) {
|
||||
if (!usuario.getNombre().matches("[a-zA-Záàâãéèêíïóôõöúçñ\\s]+")) {
|
||||
System.out.println("Fail RegexNombre");
|
||||
return false;
|
||||
}
|
||||
if (!usuario.getIdentidad().matches("[^0-9]+")) {
|
||||
System.out.println("Fail RegexIdentidad");
|
||||
return false;
|
||||
}
|
||||
return Period.between(usuario.getFechaNacimiento(), LocalDate.now()).getYears() >= 18;
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
Clase [Validador](./eclipse/anotaciones/src/Validador.java)
|
||||
|
||||
```java
|
||||
import java.lang.reflect.Field;
|
||||
import java.time.LocalDate;
|
||||
import java.time.Period;
|
||||
|
||||
public class Validador {
|
||||
public static <T> boolean validador(T objeto) {
|
||||
Class<?> clase = objeto.getClass();
|
||||
for (Field field : clase.getDeclaredFields()) {
|
||||
if (field.isAnnotationPresent(EdadMinima.class)) {
|
||||
EdadMinima edadMinima = field.getAnnotation(EdadMinima.class);
|
||||
try {
|
||||
field.setAccessible(true);
|
||||
LocalDate fechaNacimiento = (LocalDate) field.get(objeto);
|
||||
return Period.between(fechaNacimiento, LocalDate.now()).getYears() >= edadMinima.valor();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Anotacion [EdadMinima](./eclipse/anotaciones/src/EdadMinima.java)
|
||||
|
||||
```java
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.FIELD)
|
||||
public @interface EdadMinima {
|
||||
public int valor();
|
||||
}
|
||||
```
|
||||
|
||||
Clase [TestCrearUsuario](./eclipse/anotaciones/src/TestCrearUsuario.java)
|
||||
|
||||
```java
|
||||
import java.time.LocalDate;
|
||||
import java.time.Month;
|
||||
|
||||
public class TestCrearUsuario {
|
||||
public static void main(String[] args) {
|
||||
Usuario usuario1 = new Usuario("Maria", "123456789", LocalDate.of(1995, Month.MARCH, 14));
|
||||
Usuario usuario2 = new Usuario("Mario", "987654321", LocalDate.of(2020, Month.MARCH, 14));
|
||||
//System.out.println(Usuario.usuarioValido(usuario1));
|
||||
System.out.println(Validador.validador(usuario1));
|
||||
//System.out.println(Usuario.usuarioValido(usuario2));
|
||||
System.out.println(Validador.validador(usuario2));
|
||||
|
||||
}
|
||||
}
|
||||
```
|
275
008_java_oo/herencia_interfaces.md
Normal file
275
008_java_oo/herencia_interfaces.md
Normal file
@ -0,0 +1,275 @@
|
||||
# Java [Polimorfismo, Entendiendo Herencia e Interfaces](https://app.aluracursos.com/course/java-parte-3-entendiendo-herencia-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).
|
||||
|
||||
Java doc, [this](https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html)
|
||||
y [super](https://docs.oracle.com/javase/tutorial/java/IandI/super.html)
|
||||
|
||||
### 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](https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html)
|
||||
|
||||
### Sobrecarga de metodo
|
||||
|
||||
```java
|
||||
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
|
||||
|
||||
```java
|
||||
public class Vehiculo {
|
||||
public void encender() {
|
||||
System.out.println("Enciendiendo vehículo");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Clases Hijas
|
||||
|
||||
```java
|
||||
public class Automovil extends Vehiculo {
|
||||
public void encender() {
|
||||
System.out.println("Enciendiendo automovil");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```java
|
||||
public class Motocicleta extends Vehiculo {
|
||||
public void encender() {
|
||||
System.out.println("Enciendiendo motocicleta");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Main
|
||||
|
||||
```java
|
||||
public class TestVehiculos {
|
||||
public static void main(String[] args) {
|
||||
Vehiculo m = new Motocicleta();
|
||||
m.encender();
|
||||
Vehiculo c = new Automovil();
|
||||
c.encender();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Salida
|
||||
|
||||
```txt
|
||||
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](https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html) | [Clase Abstracta](https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html) |
|
||||
| - | - |
|
||||
| *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](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/package-summary.html)
|
||||
|
||||
#### Ejemplos de clases abstractas e interfaces
|
||||
|
||||
Clase **Abstracta**
|
||||
[Funcionario](./eclipse/bytebank_heredado/src/bytebank_heredado/Funcionario.java)
|
||||
|
||||
```java
|
||||
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](./eclipse/bytebank_heredado/src/bytebank_heredado/Gerente.java)
|
||||
|
||||
```java
|
||||
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](./eclipse/bytebank_heredado/src/bytebank_heredado/Autenticable.java)
|
||||
|
||||
```java
|
||||
public interface Autenticable {
|
||||
|
||||
public void setClave(String clave);
|
||||
|
||||
public boolean inicioSesion(String clave);
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
Utilización de clase **utilitaria**
|
||||
[Autenticable](./eclipse/bytebank_heredado/src/bytebank_heredado/AutenticacionUtil.java)
|
||||
|
||||
```java
|
||||
public class AutenticacionUtil {
|
||||
|
||||
private String clave;
|
||||
|
||||
public boolean inicioSesion(String clave) {
|
||||
return this.clave == clave;
|
||||
}
|
||||
|
||||
public void setClave(String clave) {
|
||||
this.clave = clave;
|
||||
}
|
||||
|
||||
}
|
||||
```
|
@ -5,6 +5,7 @@ public class Cuenta {
|
||||
private int numero;
|
||||
private Cliente titular = new Cliente();
|
||||
private static int contador = 0;
|
||||
|
||||
public Cuenta(int agencia) {
|
||||
if (agencia <= 0) {
|
||||
System.out.println("No se permiten valores negativos");
|
||||
@ -15,6 +16,7 @@ public class Cuenta {
|
||||
contador++;
|
||||
System.out.println("Cuentas creadas: "+contador);
|
||||
}
|
||||
|
||||
public void depositar(double valorDeposito){
|
||||
this.saldo += valorDeposito;
|
||||
}
|
||||
@ -57,6 +59,7 @@ public class Cuenta {
|
||||
public void setTitular(Cliente titular){
|
||||
this.titular = titular;
|
||||
}
|
||||
|
||||
public Cliente getTitular(){
|
||||
return titular;
|
||||
}
|
||||
|
@ -3,8 +3,10 @@ public class PruebaConstructor {
|
||||
Cuenta cuenta = new Cuenta(555);
|
||||
//cuenta.setAgencia(-15);
|
||||
System.out.println(cuenta.getAgencia());
|
||||
Cuenta cuenta2 = new Cuenta(333);
|
||||
Cuenta cuenta3 = new Cuenta(444);
|
||||
@SuppressWarnings("unused")
|
||||
Cuenta cuenta2 = new Cuenta(333);
|
||||
@SuppressWarnings("unused")
|
||||
Cuenta cuenta3 = new Cuenta(444);
|
||||
System.out.println(Cuenta.getContador());
|
||||
}
|
||||
}
|
@ -4,8 +4,8 @@ public class TestReferencia {
|
||||
primeraCuenta.depositar(200);
|
||||
|
||||
//Cuenta segundaCuenta = new Cuenta();
|
||||
// System.out.println(primeraCuenta); // Cuenta@23fc625e
|
||||
// System.out.println(segundaCuenta); // Cuenta@3f99bd52
|
||||
// System.out.println(primeraCuenta); // Cuenta@23fc625e
|
||||
// System.out.println(segundaCuenta); // Cuenta@3f99bd52
|
||||
|
||||
Cuenta segundaCuenta = primeraCuenta;
|
||||
segundaCuenta.depositar(100);
|
||||
@ -16,7 +16,7 @@ public class TestReferencia {
|
||||
System.out.println("Saldo primera cuenta: " + primeraCuenta.getSaldo());
|
||||
|
||||
// Obtener referencia del objeto
|
||||
System.out.println(primeraCuenta); // Cuenta@23fc625e
|
||||
System.out.println(primeraCuenta); // Cuenta@23fc625e
|
||||
System.out.println(segundaCuenta); // Cuenta@23fc625e
|
||||
|
||||
if (primeraCuenta == segundaCuenta) {
|
||||
|
@ -11,7 +11,6 @@ public class TestReferencia2 {
|
||||
|
||||
// referencia
|
||||
System.out.println(cuentaDiego.getTitular()); // Cliente@2a84aee7
|
||||
System.out.println(diego); // Cliente@2a84aee7
|
||||
System.out.println(diego); // Cliente@2a84aee7
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
public class TestReferencia3 {
|
||||
public static void main(String[] args) {
|
||||
Cuenta cuentaDeDiego = new Cuenta(1);
|
||||
public static void main(final String[] args) {
|
||||
final Cuenta cuentaDeDiego = new Cuenta(1);
|
||||
//cuentaDeDiego.titular = new Cliente();
|
||||
cuentaDeDiego.getTitular().setNombre("Diego");
|
||||
System.out.println(cuentaDeDiego.getTitular().getNombre());
|
||||
|
@ -1,5 +1,7 @@
|
||||
# Java Entendiendo la [Orientación a Objetos](https://app.aluracursos.com/course/java-parte2-introduccion-orientada-objetos)
|
||||
|
||||
Intro [POO](https://www.youtube.com/watch?v=Oigen2sjagk)
|
||||
|
||||
Diferencias con el paradigma **procedural**: se utilizó como práctica de
|
||||
programación antes de la introducción de lenguajes orientados a objetos.
|
||||
La necesidad de validar el numeroIdentidad en un formulario se utilizó como
|
||||
@ -87,7 +89,7 @@ ejemplifica un atributo de clase con valor predeterminado.
|
||||
}
|
||||
```
|
||||
|
||||
- Definicion de metodos con retorno y uso de *this* para atributos de clase
|
||||
- Definición de metodos con retorno y uso de *this* para atributos de clase
|
||||
|
||||
```java
|
||||
// Entidad Cuenta
|
||||
|
Loading…
Reference in New Issue
Block a user