Está en la página 1de 45

a

da
t a
e n
r i
o
ó n
c i )
a OO 1
a m (P P C
r
g o s I

o t
e

Pr bje t o r i o
d

o bora
a
L
Historia de la POO
• La POO se utilizó por primera vez para facilitar la creación de
simulaciones de fenómenos reales con una computadora.
• El primer lenguaje de programación orientado a objetos fue
Simula67. Sí, de 1967.
• Se popularizó en la década de los 80. Eso gracias a C++, una
extensión del lenguaje C, bastante usado en esa época.
• Los lenguajes orientados a objetos se adaptan muy bien al
desarrollo de interfaces gráficas de usuario como las que tienen los
sistemas operativos modernos.
• Algunos lenguajes orientados a objetos son: Java, C++, C#, Python,
Ruby, PHP (versión 5 o posterior), Visual Basic y Object Pascal.
Conceptos de la POO
• Los programas se diseñan como un conjunto de objetos que se
relacionan entre sí.
• Los objetos son «instancias» de una clase. Lo que en realidad se
codifica son clases.
• Los atributos son variables que pertenecen a la clase. Se dice que
mantienen el «estado» del objeto.
• Los métodos o procedimientos de un objeto son fragmentos de
código que se pueden mandar a ejecutar desde la misma clase o
desde otras. Se dice que son el «comportamiento» del objeto.
es
a s
Cl
Clases
• Cada clase tiene una función bien definida que va a desarrollar en
el programa.
• Una clase puede representar cualquier cosa que sea relevante para
el programa. Puede tratarse de objetos físicos como un árbol, o
abstractos como un conjunto de operaciones matemáticas.
• Las clases son como una plantilla o molde. Representan a un
objeto, pero si el programa lo requiere se pueden crear todos los
objetos que sean necesarios a partir de la misma clase.
Clases
• Las clases se componen de métodos y atributos.
● Los métodos son lo que le da su comportamiento a los objetos.
● Los atributos son lo que le da su estado a los objetos.
• Todos los objetos de la misma clase tendrán el mismo
comportamiento. El estado de los diferentes objetos de una misma
clase puede variar independientemente durante la ejecución del
programa.
Representación de Representación de la misma clase en Java
una clase en UML
public class NombreDeLaClase {
atributo

método() {…}
}
Clases
• Importante: En Java, las clases se tienen que declarar en un
archivo que tenga el MISMO nombre de la clase, y cuya extensión
sea .java.
• Puede haber más de una clase en un solo archivo. En ese caso se
debe usar el nombre de una de las clases como nombre del
archivo.
o s
u t
ri b
At
Atributos
• Como su nombre lo indica, los atributos son características del
objeto que representa la clase.
● Por ejemplo, si la clase representa un carro sus atributos pueden
ser: El color, su ubicación, la cantidad de pasajeros.
• Los atributos son como variables, pero pertenecen sólo a la clase
donde se declaran.
• Pueden declararse en cualquier parte DENTRO de una clase, pero
siempre FUERA de los métodos de la clase.
• Una clase puede tener varios atributos. El estado de un objeto es el
valor de todos sus atributos en un momento dado. Por eso el estado
puede variar en el tiempo, cuando cambian los valores de los
atributos.
Declaración de atributos en Java
• Un atributo se puede declarar de la siguiente forma:

Visibilidad del atributo, Nombre del atributo,


se explicará más adelantedebe ser descriptivo
private double posicionX = 0.0; El valor inicial
del atributo
Tipo de dato del atributo,
en este caso double es un número real
(por ejemplo 10.5)
• En esta forma de declarar el atributo, su valor se «inicializa» de una vez.
Declaración de atributos en Java
• Un atributo también se puede declarar así:

Visibilidad del atributo Nombre del atributo


private double posicionX;

Tipo del atributo

• Los atributos también se puede declarar sin la inicialización del valor.


La inicialización siempre se hace, pero dentro de un método especial
llamado «constructor».
Constantes
• Las constantes son atributos cuyo valor no cambia durante la
ejecución del programa.
• A diferencia de los demás atributos, las constantes suelen ser
accedidas por más de una clase. También se deben inicializar
donde se declaran y no en el constructor.
• Se usa las palabras reservadas static y final.
● Cada objeto usa una posición diferente de memoria de la
computadora. Al usar static se indica que todos los objetos de
la clase usen la misma posición de memoria para almacenar el
atributo o ejecutar el método declarado de esa forma. Además,
no es necesario instanciar la clase para poder usar métodos y
atributos estáticos.
● final previene la modificación del valor de un atributo. De esa
forma conserva el valor que se le asignó desde el principio.
Declaración de constantes en Java
• Ejemplo de la declaración de una constante:

Nombre de la
Visibilidad Tipo de dato constante
public static final double ANCHO = 100.0;

Usadas para declarar como constante Valor de la constante


(no va a cambiar)

• Los nombres de constantes se colocan con MAYÚSCULAS. Si son varias


palabras se separan con «_».
public static final int DIAS_SEMANA = 7;
o s
od
ét
M
Métodos
• Los métodos son acciones que ejecuta el objeto al que representa
la clase.
● Por ejemplo un método de la clase Carro podría ser avanzar().
• Al igual que con los atributos, una clase puede tener varios
métodos.
• Los métodos se pueden definir en cualquier parte DENTRO de la
clase.
• Son el comportamiento del objeto. Es decir, lo que el objeto tiene
que hacer cuando se ejecuta el método.
• Los métodos también tienen un tipo de dato. Es el tipo del valor
que el método retorna cuando termina su ejecución.
• También pueden tener o no parámetros. Son valores o variables
que se envían al método para que los use cuando se ejecuta.
• Dentro de un método se puede tener todas las variables locales
que se necesiten. Estas variables NO son atributos, aunque se
declaran de forma similar.
Declaración de métodos en Java
• A continuación se presenta un método que suma dos números que
recibe como parámetros:

Parámetros
Tipo de dato
Nombre del método(son opcionales)
Visibilidad
public double sumar(double num1, double num2) {
return num1 + num2;
}
Cuerpo del método

• La suma de dos números de tipo double produce como resultado otro


número de ese tipo. Por eso el tipo de dato del método es double.
Declaración de métodos en Java
• Ejemplo de la declaración de un método:

Parámetros
Tipo de dato
Nombre del método (son opcionales)
Visibilidad
public void avanzar(double dX, double dY) {

}
Cuerpo del método

• Este método es de tipo void. Sólo los métodos pueden ser de este tipo, y
significa que no se retorna ningún valor.
Relación entre métodos y atributos
• Los métodos pueden modificar los valores de los atributos.
• En este ejemplo, posicionX y posicionY son atributos de la clase
Carro:

public void avanzar(double dX, double dY) {


posicionX = posicionX + dX;
posicionY = posicionY + dY;
}
Sobrecarga de métodos
• La sobrecarga de métodos se da cuando dentro de la misma clase
hay dos o más métodos que tienen el mismo nombre.
• Lo único que diferencia a los métodos son sus parámetros.

public void avanzar(double dX, double dY) {


posicionX = posicionX + dX;
posicionY = posicionY + dY;
}

public void avanzar(double dXY) {


posicionX = posicionX + dXY;
posicionY = posicionY + dXY;
}
constructores
• Como se mencionó, el constructor es un método especial.
• Su nombre tiene que ser IGUAL al de la clase donde está.
• Cuando se declara un constructor no se debe indicar su tipo de
dato.
• Sin los constructores no habría objetos. Si se quiere instanciar una
clase para crear un objeto obligatoriamente se tiene que llamar al
constructor de la clase. Aunque existen unas pocas excepciones.
• La función del constructor es inicializar los atributos de la clase
cuando se instancia un nuevo objeto.
• Puede recibir parámetros y se puede sobrecargar.
• Además de inicializar atributos puede realizar otras operaciones.
Incluso llamar a otros métodos.
• Los constructores se llaman usando la palabra reservada new.
el constructor de la clase Carro
• La clase Carro tiene cuatro atributos:
● color: Es de tipo String, una cadena de texto.
● posicionX y posicionY: Son de tipo double, número real.
● cantidadPasajeros: Es de tipo int, un número entero.
public Carro() {
color = “Gris”;
posicionX = 0.0;
posicionY = 0.0;
cantidadPasajeros = 0;
}
o s
et
bj
O
Objetos
• Un objeto es una instancia de una clase. Eso quiere decir que se
trata de un caso particular o ejemplar de esa clase.
• Por ejemplo un objeto de la clase Carro en Java se crea de esta
forma:
El operador = asigna al nombre carro
la instancia de la clase que se crea del lado
derecho
Carro carro = new Carro();

Indica la clase del objeto Constructor de la clase Carro


El nombre del objeto, Palabra reservada de Java
notar que está con para crear un nuevo objeto
minúscula
Uso de métodos y atributos
• Sólo se puede acceder a los métodos y atributos de un objeto cuando la
visibilidad lo permite.
• Para acceder a los métodos y atributos de un objeto se usa «.».

Nombre del Nombre del método Parámetros del


objeto método
carro.avanzar(1.0, 5.5);

Punto, para acceder a los métodos


y atributos de la clase Carro
• Al ejecutarse esa instrucción, se ejecuta todo el código del método
avanzar() de la clase Carro, modificando la posición del objeto carro. Al
terminar se continúa ejecutando la instrucción siguiente.
Las clases son un tipo de dato
• Además de los tipos de dato como boolean, int, char, double, float
y otros de Java, todas las clases son un tipo de dato.
• Por eso los constructores, aunque son métodos, no se declaran con
un tipo de dato. Ya se sabe que retornan un nuevo objeto, cuyo tipo
es la clase del constructor.
• Esto quiere decir que donde sea que se pueda usar un tipo de dato,
se puede usar una clase.
● Los atributos pueden ser objetos.
● Las variables locales de los métodos pueden ser objetos.
● Los parámetros de un método pueden ser objetos.
● El tipo de dato de un método puede ser una clase.
• Los tipos de dato que no son clases se conocen como «tipos de
dato primitivos».
Clases sin constructor
• En Java existen algunas clases que representan tipos de datos primitivos.
Para usar objetos de estas clases no es necesario llamar a su constructor.

String letras = “abc”;

Boolean aprobado = true;

Integer contador = 0;

Double precio = 3.50;


• letras, aprobado, contador y precio son objetos, aunque también se
pueden usar como si fueran de tipos primitivos.
O
PO
la
de
os
pi
i
ri nc
P
Principios de la POO
• Existen algunos principios que bien aplicados permiten aprovechar
las ventajas de la POO.
• Los principios más importantes son:
● Abstracción
● Herencia
● Polimorfismo
● Encapsulamiento
● Ocultación
Abstracción
• Es la capacidad de aislar «qué hace» algo de «cómo lo hace».
• Por ejemplo interesa saber que un avión puede volar, aunque se
desconozca cómo lo logra.
• La abstracción es importante en la POO porque las clases suelen
representar objetos del mundo real. Antes de saber cómo imitar su
comportamiento en un programa, es más importante tener claro
cuál es ese comportamiento que se quiere lograr.
• Permite limitar las funciones o responsabilidades que cada clase
del programa deberá tener.
Herencia
• La herencia se usa cuando se identifican características comunes en
varias clases.
• Por ejemplo se tienen las clases Tiburon y PezGlobo. Los tiburones y
los peces globo nadan. Entonces se crea una clase nueva llamada Pez
donde se coloca el método nadar(). Como sólo los peces globo se
pueden inflar, el método inflar() se queda en PezGlobo.
• Se reutiliza código, porque el método nadar() sólo aparece en la clase
Pez.
• Si el método nadar() tuviera que modificarse, sólo se tiene que
cambiar el código en la clase Pez.
• Si se quisiera añadir más peces al programa sólo tendrían que
heredar de Pez para poder nadar.
• Cuando una clase hereda de otra se dice que es una «subclase».
Herencia
• La palabra reservada de Java para la herencia es extends.

public class Pez {



public void nadar() {…}
}

public class PezGlobo extends Pez {


public class Tiburon extends Pez {


public void inflar() {…}
}
}

• El método nadar() se puede usar en los objetos de Tiburon y


PezGlobo, aunque esas clases no tengan ese código. inflar() sólo se
puede usar en los objetos PezGlobo.
Polimorfismo
• Es tener dos métodos con el mismo nombre, tipo de retorno y
parámetros; en clases diferentes, pero que heredan de la misma
clase.
• Cuando se llame al mismo método de objetos de las clases
diferentes, se ejecuta el método que corresponde a cada clase.
• Por ejemplo todas las figuras geométricas tienen área. Entonces el
método calcularArea() se colocaría en la clase Figura. Circulo y
Cuadrado heredan de Figura, entonces se sabe que cuentan con un
método calcularArea(). Pero el área para esas figuras se calcula de
manera diferente. Entonces el método calcularArea() se debe
redefinir en Circulo y Cuadrado.
Encapsulamiento
• Es el «ocultamiento de estado». Los objetos son cápsulas aisladas
cuyo estado debe mantenerse protegido.
• Significa que los atributos sólo se deben modificar a través de
métodos públicos que lo hagan de manera controlada.
• Si los objetos pueden manipular libremente el estado de los otros,
puede haber efectos secundarios inesperados. El encapsulamiento
es una forma de evitar posibles errores en los programas.
Ocultación
• Es muy similar al encapsulamiento.
• Se utiliza debido a que muchos lenguajes de POO permiten al
programador «pasar por alto» el principio de encapsulamiento.
• Por ejemplo Java permite que los atributos de las clases no estén
encapsulados si el programador así lo desea.
• La ocultación se definió entonces como una característica extra de
algunos lenguajes. Resulta siendo como el «uso voluntario» del
principio de encapsulamiento.
• Los modificadores de visibilidad como los vistos en métodos y
atributos permiten la aplicación de la ocultación.
es
e t
qu
Pa
Paquetes
• Son una forma conveniente de organizar las clases.
• Todas las clases relacionadas se colocan dentro del mismo paquete.
• El uso de paquetes es opcional, pero mientras más clases haya, más
necesaria se vuelve su organización.
• Puede haber paquetes dentro de otros paquetes, como si los paquetes
fueran carpetas y las clases archivos. De hecho, los paquetes obligan a
utilizar diferentes carpetas para las clases.
• Se usa package para indicar a qué paquete pertenece una clase:

package simulacion;

• Sólo se coloca una vez FUERA de la clase.


Paquetes
• Los paquetes limitan el acceso a las clases. Para acceder a una clase hay tres opciones:
● La clase que se quiere acceder debe encontrarse en el mismo paquete.
● Anteponer el nombre del paquete al nombre de la clase, todas las veces que aparezca.

● Importar el paquete. java.util.ArrayList

import java.util.ArrayList; Importa sólo a la clase ArrayList


import java.util.*;
Importa a todas las clases

del paquete java.util
Puede haber varios imports y también se colocan FUERA de la clase.
a d
i lid
i b
i s
V
Visibilidad
• Los modificadores de visibilidad son palabras reservadas que
permiten controlar el acceso a las clases, métodos y atributos. De
esa forma se aplica el principio de ocultación.
• Java ofrece cuatro modificadores de visibilidad: public, protected,
private y otro por omisión. Los modificadores protected y private
sólo se pueden usar con métodos y atributos.
• La siguiente tabla muestra qué clases tienen acceso según el
modificador. Si no se tiene acceso es como si el método o atributo
no existiera.
Modificador Clase Paquete Subclases Cualquiera

public Sí Sí Sí Sí
protected Sí Sí Sí No
Ninguno Sí Sí No No
private Sí No No No
es
o n
c i
da
e n
o m
c
Re
Buenas prácticas de programación
• Las clases se nombran con inicial mayúscula. Los paquetes,
atributos, métodos, variables y parámetros con inicial minúscula.
No se usa «_».
• Dentro de la clase, declarar primero todos los atributos. Después el
o los constructores y por último todos los métodos.
• Inicializar los atributos en el constructor y no en su declaración (al
inicio de la clase).
• Declarar los atributos como privados y hacerlos accesibles sólo a
través de métodos públicos (principio de encapsulamiento).
• Usar constantes para guardar valores que no cambian durante la
ejecución del programa y que aparecen en muchas partes.
• Comentar cada clase, atributo y método. Indicar qué representa,
cómo se usa o qué hace.
• Usar tabulaciones y líneas en blanco para mantener el código
ordenado y fácil de entender.
c o
c ti
á
pr
l o
p
em
Ej
Enunciado
• Se solicita un programa donde se tengan los siguientes tipos de
automóvil: Deportivo, sedán y pick-up.
• Los automóviles reciben instrucciones para desplazarse sobre un
cuadrado de 100m de lado.
● Si la instrucción para mover el automóvil puede hacer que se
salga del área permitida, el automóvil no se debe mover.
• Los automóviles deben reportar en qué posición quedaron dentro
del área cuando se mueven.
• Cuando se crea un nuevo automóvil, debe aparecer en el centro del
área.
• Se deben proporcionar operaciones para agregar o quitar un
pasajero a los automóviles. El sedán puede llevar hasta cuatro
personas y el deportivo y el pick-up hasta dos personas. Para que
un automóvil se pueda mover debe tener por lo menos un
pasajero.
Enunciado
• Los pick-ups también deben poder llevar una carga de hasta
1,000Kg. Se debe proporcionar un método para modificar la carga.
La cantidad de carga que se quiere agregar o quitar se recibe como
parámetro, y puede ser positiva o negativa.
Ideas para la solución
• Se usará un plano cartesiano para representar el área donde se pueden
mover los vehículos.
● Cada vehículo tendrá una posición en el eje x y otra en el eje y.
• El método avanzar() verificará que haya por lo menos un pasajero antes
de mover el vehículo. También verificará que el vehículo no se salga del
área permitida.
• Sedan, Deportivo y PickUp heredarán de una clase Carro.
• Se usará una clase Area, que sólo tendrá dos constantes para indicar
las dimensiones del área donde se pueden mover los vehículos.
• El código de las clases y cómo ejecutar el programa se encuentra en la
carpeta «Ejemplo» incluida con esta presentación.