Programación orientada a objetos
¿Qué es POO y por qué es importante?
POO (Programación orientada a objetos), es un paradigma de programación, modelo o estilo de programación que brinda una forma limpia y clara de como usar conceptos de clases y objetos. Permitiendo tener un código organizado, limpio y sencillo de mantener.
Herencia
Introduce el concepto de jerarquías con Clases Padres (Superclases) y Clases Hijos (Subclases)
- Clase Padre
1
2
3
4
5
6
7
8
9
public class Character {
public String name;
public String maxHp;
Character(String name, String maxHp) {
this.name = name;
this.maxHp = maxHp;
}
}
- Clase Hijo
1
2
3
4
5
6
7
8
9
10
11
public class Magician extends Character {
public String magicType;
public String typeAttack;
private int level;
Magician(String name, String maxHp, String magicType, String typeAttack) {
super(name, maxHp);
this.magicType = magicType;
this.typeAttack = typeAttack;
}
}
Esto simplifica la cantidad de código que se escribe, aplicando DRY (Don’t repeat yourself).
Encapsulamiento
Restringe el acceso a métodos y atributos de las clases
- Público: Se pueden acceder desde cualquier parte del código.
- Protegido: Se puede acceder únicamente desde la misma clase o desde las clases que heredan.
- Privado: Se puede acceder únicamente desde la misma clase.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Magician extends Character {
public String magicType;
public String typeAttack;
private int level;
public Magician(String name, String maxHp, String magicType, String typeAttack, int level) {
super(name, maxHp);
this.magicType = magicType;
this.typeAttack = typeAttack;
this.level = level;
}
}
final Magician magician = new Magician("Magician", "100", "ICE", "ICE BREAKER", 2);
final int level = magician.level; // 'level' has private access in 'ec.api.test.service.Magician'
final String typeAttack = magician.typeAttack;
Abstracción
Se trata de modelar entidades del mundo real centrado en él ¿Qué hace? Y NO en él ¿Cómo lo hace?, ocultando los detalles internos de la implementación.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public abstract class Pago {
protected double amount;
protected Pago(double amount) {
this.amount = amount;
}
public abstract void makePayment();
public void showInfoAmount() {
System.out.printf("Amount to pay: $%s%n", amount);
}
}
public class PagoEfectivo extends Pago {
public PagoEfectivo(double amount) {
super(amount);
}
@Override
public void makePayment() {
System.out.printf("Making payment %s ...", this.amount);
}
}
public class PagoTarjeta extends Pago {
private String cardNumber;
public PagoTarjeta(double amount, String cardNumber) {
super(amount);
this.cardNumber = cardNumber;
}
@Override
public void makePayment() {
System.out.println("Making Payment for Tarjeta " + this.cardNumber);
}
@Override
public void showInfoAmount() {
System.out.printf("[CARD] Amount to pay: $%s%n", amount);
}
}
final PagoEfectivo pagoEfectivo = new PagoEfectivo(100);
final PagoTarjeta pagoTarjeta = new PagoTarjeta(100, "123123123123");
final List<Pago> payments = new ArrayList<>();
payments.add(pagoTarjeta);
payments.add(pagoEfectivo);
for (Pago pago : payments) {
pago.showInfoAmount();
}
1
2
[CARD] Amount to pay: $100.0
Amount to pay: $100.0
Output
Polimorfismo
Permite que un método tome varias formas (Varía su comportamiento), existe dos tipos:
Polimorfismo Dinámico
- Ocurre en Tiempo de Ejecución.
- Se da cuando se hace Herencia y el comportamiento de clase hijo cambia con el de la clase padre
- Se evidencia cuando se usa
@Override
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
public abstract class Animal {
public abstract void doSound();
}
public class Cat extends Animal {
@Override
public void doSound() {
System.out.println("Miau");
}
}
public class Dog extends Animal {
@Override
public void doSound() {
System.out.println("Woof");
}
}
final Cat cat = new Cat();
final Dog dog = new Dog();
final List<Animal> animals = new ArrayList<>();
animals.add(cat);
animals.add(dog);
for (Animal animal : animals) {
animal.doSound();
}
1
2
Miau
Woof
output
Polimorfismo Estático
- Ocurre en Tiempo de Compilación
- Se da cuando realizamos sobrecarga de métodos (Varios métodos con el mismo nombre, pero, con diferentes argumentos)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Dog extends Animal {
@Override
public void doSound() {
System.out.println("Woof");
}
public void doSound(String ambient) {
if (ambient.equals("pool")) {
System.out.println("woof glu glu glu");
}
if (ambient.equals("forest")) {
System.out.println("woof woof oof of f");
}
}
}
final Dog dog = new Dog();
dog.doSound("forest");
1
woof woof oof of f
output
Tiempo de Compilación vs. Tiempo de Ejecución
Compilación
1) javac lee los archivos .java y los pasa bytecode (archivos con extensión .class) 2) Aquí el compilador verifica, tipos correctos, métodos y variables que existan, sintáxis válida.
Proceso Compilación
Ejecución
1) La JVM toma esos archivos .class (bytecode) y ejecuta instrucción por instrucción.
Proceso Ejecución
Analogía
Imaginemos que queremos cocinar algo:
- Compilación: Verificar que tengamos todos los ingredientes y utensilios necesarios. (Sin esto no podemos empezar a cocinar)
- Ejecución: Aquí se nos puede quemar o que se nos pase la sal. (Podemos cocinar, pero, en el proceso podemos cometer errores)


