Java Polimorfismo: Herencia e Interfaces

This commit is contained in:
devfzn 2023-07-03 19:26:28 -04:00
parent 0f56c54d51
commit a5f5462502
Signed by: devfzn
GPG Key ID: E070ECF4A754FDB1
41 changed files with 1037 additions and 11 deletions

8
.gitignore vendored
View File

@ -4,3 +4,11 @@ test/
out/
*.class
*.iml
.metadata/
bin/
.settings/
.classpath
.project
*.uml
*.uxf
*.umlcd

View File

@ -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)

View 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();
}

View 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));
}
}

View 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;
}
}

View 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;
}
}

View File

@ -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);
}
}

View File

@ -0,0 +1,9 @@
package bytebank_heredado;
public interface Autenticable {
public void setClave(String clave);
public boolean inicioSesion(String clave);
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -0,0 +1,10 @@
package bytebank_heredado;
public class Contador extends Funcionario {
@Override
public double getBonificacion() {
return 200.0;
}
}

View File

@ -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();
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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();
}

View File

@ -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);
}
}

View File

@ -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;
}
}
}

View File

@ -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));
}
}

View File

@ -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());
}
}

View File

@ -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());
}
}

View File

@ -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"));
}
}

View File

@ -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"));
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -0,0 +1,5 @@
package enums;
public enum Dia {
LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO
}

View File

@ -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());
}
}

View File

@ -0,0 +1,8 @@
/**
*
*/
/**
*
*/
module bytebank_heredado {
}

View File

@ -0,0 +1,7 @@
package vehiculos;
public class Automovil extends Vehiculo {
public void encender() {
System.out.println("Enciendiendo automovil");
}
}

View File

@ -0,0 +1,7 @@
package vehiculos;
public class Motocicleta extends Vehiculo {
public void encender() {
System.out.println("Enciendiendo motocicleta");
}
}

View File

@ -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();
}
}

View File

@ -0,0 +1,7 @@
package vehiculos;
public class Vehiculo {
public void encender() {
System.out.println("Enciendiendo vehículo");
}
}

View 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));
}
}
```

View 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;
}
}
```

View File

@ -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;
}

View File

@ -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());
}
}

View File

@ -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) {

View File

@ -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
}
}

View File

@ -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());

View File

@ -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