1. Unidad 3: Encapsulamiento
y modularidad
Autor(es):
Ciencias de la Ingeniería
Carrera de Sistemas
Programación Orientada a Objetos
Mg. Luis Fernando Aguas Bucheli
+593 984015184
@Aguaszoft
Laguas@uisrael.edu.ec
Aguaszoft@Outlook.es
2. “Ciertos libros son hechos para ser
probados, otros para ser tragados y
unos pocos son hechos para ser
masticados y digeridos.
(Anónimo)
Ciencias de la Ingeniería
Carrera de Sistemas de Información
Programación Orientada a Objetos
3. Resultado de Aprendizaje
• Aplicar los lenguajes de programación en el diseño y
desarrollo de sistemas con interfaces de usuario orientadas a
humanos, usables y accesibles.
7. 7
• Todas las clases son descendientes de la clase Object
• La cláusula extends especifica el ancestro inmediato de la
clase
• Una subclase o clase derivada hereda todos los campos y
métodos de la superclase o clase base
• Java soporta herencia simple (sólo una clase base)
Herencia en Java
"hereda de"
"extiende"
"is a"
ancestro
superclase
clase base
descendientes
subclases
clases derivadas
8. 8
class Figura {
int x, y;
public void print() { ... }
public void setX(int x) { this.x = x; }
public void setY(int y) { this.y = y; }
}
class Rectangulo extends Figura {
int largo, ancho;
public void setLargo(int largo) { this.largo = largo; }
public void setAncho(int ancho) { this.ancho = ancho; }
}
class App {
void f() {
Rectangulo r = new Rectangulo();
r.setX(10); r.setY(20);
r.setAncho(100); r.setLargo(300);
Ejemplo
La clase Circulo es derivada de la
clase base Figura
La clase Circulo hereda métodos
setX y setY de clase base Figura
9. 9
Encapsulamiento
• Una clase derivada tiene acceso a los miembros
public y protected de una clase base, aunque
pertenezcan a paquetes diferentes
• Una clase derivada tiene acceso a los miembros
package de una clase base si ambas clases
pertenecen al mismo paquete
• Una clase derivada no tiene acceso a los
miembros private de una clase base
10. 10
Circulo circulo;
circulo = new Circulo();
Figura figura;
figura = circulo;
circulo
figura
Compila y ejecuta bien (un círculo es una figura)
Restricción: no se puede usar figura para acceder a métodos
especializados de Circulo
figura.getRadio(); // no compila
Polimorfismo
11. 11
Polimorfismo
• Java permite asignar un objeto a una variable
declarada con un tipo de datos ancestro
void metodo1(Figura f) {
f.print();
...
}
void metodo2() {
metodo1(new Circulo());
}
12. 12
public class DTE {
...
public void validar() {
...
}
}
public class Factura extends DTE {
public void validar() {
super.validar();
...
}
}
Reescritura de Métodos
Reescritura del método validar() en
clase derivada (la firma y el tipo de
retorno coinciden con los de la clase
base)
Invocación a funcionalidad provista
en la clase base, para extender en
lugar de reemplazar
13. 13
• Al invocar un método no static, el tipo real del
objeto sobre el que se invoca el método — y no
el tipo de la referencia — es utilizado para
determinar qué versión del método invocar
• El tipo del objeto sobre el que se invoca el
método se obtiene en tiempo de ejecución, por
eso esta funcionalidad recibe el nombre de
dynamic binding, o late binding
void procesarDTE(DTE dte) {
dte.validar();
...
}
Dynamic Binding
Dynamic binding: invoca a
Factura.validar() si dte es una
referencia a una Factura
14. 14
• Java es fuertemente tipeado, exige
compatibilidad de tipos en tiempo de
compilación:
o Permite asignar un objeto a una variable de un
tipo ancestro
o Permite asignar un objeto a una variable de un
tipo descendiente, pero exige que se explicite este
uso, mediante un cast (si el cast falla en
ejecución, la máquina virtual lanza un
ClassCastException)
Factura factura = (Factura) dte;
o No permite realizar una conversión de un objeto a
un tipo que no es ancestro ni descendiente
Compatibilidad de Tipos
15. 15
• El método getClass de la clase Object retorna un
objeto de tipo Class correspondiente a la clase real a
la que pertenece el objeto
• El operador instanceof indica si un objeto es de una
clase determinada o de alguna clase descendiente
if (dte instanceof Factura) {
Factura factura = (Factura) dte;
// uso de factura
}
Identificación de Tipo
Ojo, no abusar de este mecanismo!
(hacerlo significa que se está programando
de manera tradicional, sin obtener los
beneficios de la OOP)
16. Gracias
Mg. Luis Fernando Aguas Bucheli
+593 984015184
@Aguaszoft
Laguas@uisrael.edu.ec
Aguaszoft@Outlook.es