Documentos de Académico
Documentos de Profesional
Documentos de Cultura
EN LINEA
PROGRAMACIÓN ORIENTADA A OBJETO (POO)
4 créditos
Profesor:
Ingeniero. Carlos Alfredo Silva Villafuerte,
Titulaciones Semestre
CAFETERÍA VIRTUAL.
Tabla de contenido
Aprender los conceptos básicos y desarrollar habilidades de programación bajo el enfoque orientada
a objetos, comportamiento, relaciones y operaciones, para que el estudiante resuelva problemas a
través del entendimiento de objetos reales o imaginarios del mundo.
Programación Orientada a
Objeto
En la POO las entidades centrales son los objetos, que son tipos de datos que encapsulan con el
mismo nombre estructuras de datos, operaciones o algoritmos que manipulan esos datos.
Abstracción
Encapsulam
Jerarquia PPOO
iento
Modularida
d
Abstracción. - Representa las características esenciales de un objeto sin preocuparse de las restantes
características. Se centra en la vista externa de un objeto de modo que sirve para separar el
comportamiento esencial de un objeto, de su implementación.
Jerarquía. - Es la propiedad que permite una ordenación de las abstracciones, las dos jerarquías más
importantes de un sistema complejo son:
En la actualidad existe una gran cantidad de Lenguajes de Programación, y estos han evolucionado
de acuerdo a las necesidades presentadas en cada proceso del desarrollo, A continuación, se detallan
algunos paradigmas de programación:
Imperat
ivo
Funcio
Lógico Paradigmas
nal
Orientado a
objeto
Paradigma Funcional. - Los programas funcionales se basan en el uso de una o más funciones
dentro de las cuales se pueden utilizar funciones creadas anteriormente. Su objetivo es dividir el
programa en módulos de forma que cada uno de éstos realice una única función. El primer lenguaje
de programación funcional fue LISP. Existen dos tipos de lenguajes funcionales: los puros (como
HASKELL) y los híbridos (SAP, ML, Scheme)
Azpitarte et al (2009) expresa que las API se componen de dos elementos relacionados; la primera es
una especificación que describe cómo se intercambia la información entre programas, hecha en
forma de una solicitud de procesamiento y una devolución de los datos necesarios. El segundo es
una interfaz de software escrita según esa especificación y publicada de alguna manera para su uso.
En la Figura 1, se muestra el rol que juegan las API, lo que hace posible conectar fácilmente
diferentes fuentes de datos y habilitar la cadena de valor digital.
Según este modelo, a grandes rasgos, el desarrollo software consta de las siguientes fases:
Análisis. - Esta es una de las fases más importantes puesto que se trata de definir y analizar el
problema en su totalidad.
Diseño. – Junto con el análisis anterior, diseña una solución del problema. Se trataría de definir los
módulos, patrones, algoritmos, entre otros, que ayudaran a una solución. Entre esta fase y la
anterior, se debería consumir un 70-80 % del tiempo del proyecto.
Mantenimiento. - Realizar mejoras varias sobre el producto desde el punto de vista tecnológico,
funcional, entre otros.
En la vida real podremos apreciar que casi todo se compone de objetos (coche, lapicero, casa y,
porque no, personas). Todos entendemos que tanto un BMW verde como un SEAT rojo son
coches, pero son distintos en su aspecto físico. Pero a pesar de esa diferencia de aspecto entendemos
que ambos tienen unas características comunes como son poseer ruedas, un volante, asientos, Esas
Además, se puede suponer que la clase de un objeto describe como es dicho objeto.
Por ejemplo:
clase Coche:
4 ruedas
1 volante
5 asientos
acelerar
frenar
girar
Como se puede observar en esta clase no sólo describe que cosas posee un coche, sino que también
describe que acciones puede realizar un coche (acelerar, frenar y girar). Es decir, una clase define los
atributos y las acciones (o métodos) que puede realizar un objeto de la clase.
Además, se comprueba que un objeto puede estar formado por otros objetos, por ejemplo, el coche
posee 4 objetos de la clase Rueda.
En el mundo real los objetos se relacionan entre sí, un objeto puede pedir a otro que realice alguna
acción por él. En la vida real una persona acelera, pero lo hace pidiéndoselo al coche, que es quien
realmente sabe acelerar, no la persona. El hecho de que un objeto llame a un método de otro objeto
se indica diciendo que el primer objeto ha enviado un mensaje al segundo objeto, el nombre del
mensaje es el nombre de la función llamada.
Recuerda que: Una interpretación de una clase es el plano que describe como
es un objeto de la clase, por tanto, podemos entender que a partir de la clase
podemos fabricar objetos. Ese objeto construido se le denomina instancia, y al
proceso de construir un objeto se le llama instanciación.
Cuando se construye un objeto es necesario dar un valor inicial a sus atributos, es por ello que
existe un método especial en cada clase llamado constructor, el cual es ejecutado de forma
automática cada vez que es instanciada una variable. Generalmente el constructor se llama igual que
la clase y no devuelve ningún valor. Análogamente destructor es un método perteneciente a una
Sencillo. - Elimina la complejidad de los lenguajes como C y da paso al contexto de los lenguajes
modernos orientados a objetos. Aunque la sintaxis de Java es muy similar a C y C++, que son
lenguajes a los que una gran mayoría de programadores están acostumbrados a emplear.
Seguro. - El sistema de Java tiene ciertas políticas que evitan que se puedan codificar virus con este
lenguaje. Existen muchas restricciones, especialmente para los denominados applets, que limitan lo
que se puede y no puede hacer con los recursos críticos de una computadora.
Multitarea. - Un lenguaje que soporta múltiples threads, hilos o tareas, es un lenguaje que puede
ejecutar diferentes líneas de código al mismo tiempo. El soporte y la programación de hilos en Java
está integrado en la propia sintaxis del lenguaje.
Dinámico. - En Java no es necesario cargar completamente el programa en memoria, sino que las
clases compiladas pueden ser cargadas bajo demanda en tiempo de ejecución (dynamic binding).
Esto proceso permite la carga de código bajo demanda.
Es un lenguaje que es compilado, generando ficheros de clases compilados, pero estas clases
compiladas son en realidad interpretadas por la máquina virtual java. Siendo la máquina
virtual de java la que mantiene el control sobre las clases que se estén ejecutando.
Es un lenguaje multiplataforma: El mismo código java que funciona en un sistema operativo
funcionará en cualquier otro sistema operativo que tenga instalada la máquina virtual java.
Para poder trabajar con java es necesario emplear un software que permita desarrollar en java,
existen varias alternativas comerciales en el mercado: JBuilder, Visual Age, Visual Café, y un
conjunto de herramientas shareware e incluso freeware que permiten trabajar con java. Pero todas
estas herramientas en realidad se basan en el uso de una herramienta proporcionada por Sun, el
creador de java, que es el Java Development Kit (JDK). Nosotros nos centraremos en el uso de dicha
herramienta.
El lenguaje se basa en pensar que hay en el mundo real objetos y esos objetos tienen un tipo, o
clase. Por ello el lenguaje se basa en clases, que describen como son los objetos.
Recuerda que: El lenguaje tiene una clase que describe ficheros, una que
describe cadenas de texto, o bien se puede crear clases, por ejemplo, la clase
Persona que describe los datos que interesan de una persona.
Por ello siempre para comenzar a trabajar con un programa java hay que crear una clase:
Cuando se intenta ejecutar una clase java la máquina virtual lo que hace es llamar a un método
especial llamado main que debe de estar dentro de la clase a ejecutar:
}
}
Estructura de un programa
La estructura de un programa de Java es similar a la de un programa de C/C++. Por su diseño,
permite a los programadores de cualquier otro lenguaje leer código en Java sin mucha dificultad.
Java emplea siempre la Programación Orientada a Objetos por lo que todo el código se incluye
dentro de las clases. Aunque ya se explicarán detenidamente más adelante, las clases son
combinaciones de datos (constantes y variables) y rutinas (métodos).
Como primer ejemplo sencillo de programa escrito en Java se va a utilizar uno que muestra un
mensaje por la pantalla del ordenador. Por ejemplo, el programa Hola.java:
*/ Fin de comentarios
Tipo primitivo. - Una variable de tipo primitivo contiene un solo valor del tamaño y formato
apropiado de su tipo: un número, un carácter, o un valor booleano.
La tabla siguiente lista los tipos de datos primitivos soportados por Java.
Números enteros
Números reales
Otros tipos
Referencia. - Los arreglos, las clases y las interfaces son del tipo referencia. El valor de una variable
del tipo referencia es una dirección de un conjunto de valores representados por una variable.
Las referencias en Java no son como en C++, éstas son identificadores de instancias de alguna clase
en particular.
Ejemplo:
Sentencia. - Una instrucción o sentencia representa la tarea más sencilla que se puede realizar en un
programa.
Sentencias de expresión. - Los siguientes tipos de expresiones pueden ser hechas dentro de una
sentencia terminando la expresión con punto y coma (;):
Expresiones de asignación
Cualquier uso de los operadores ++ y --
Llamada de métodos
Ejemplo:
valorA++; // incremento
Ejemplo:
int bValue;
String varCad;
Sentencias de control de flujo. - Las sentencias de control de flujo determinan el orden en el cual
serán ejecutadas otro grupo de sentencias. Las sentencias if y for son ejemplos de sentencias de
control de flujo.
Bloque de sentencias. - Un bloque es un grupo de cero o más sentencias encerradas entre llaves ( { y
} ). Se puede poner un bloque de sentencias en cualquier lugar en donde se pueda poner una
sentencia individual.
Bifurcacion if-else
La bifurcación if-else es la más simple de las estructuras:
if (expresionBooleana)
{
sentencias1;
}
else
{
sentencias2;
}
Bifurcacion if-else-if-else
if (expresionBooleana)
{
sentencias1;
}
else if (exprecionBooleana2)
{
sentencias2;
}
else
{
sentencias3;
}
Bifurcacion switchs
El switch es clasificado como selector de sentencias de ejecución evaluando una expresión integral
(valor numérico entero o carácter).
switch (expresionIntegral)
{
case valor1: sentencias1; break;
case valor2: sentencias2; break;
case valor3: sentencias3; break;
La ejecución se resuelve evaluando la expresión integral y se busca desde la primera expresión hacia
la expresión por defecto, cual etiqueta de evaluación de caso resuelve ser igual en valor, al valor de la
expresión integral. En caso de no ser ninguna de las etiquetas (case) igual al valor de la expresión se
ejecutan las sentencias de la opción default.
En caso de no agregar las sentencias break, se ejecutará de continuo una etiqueta tras otra hasta
encontrar un break o salir del alcance definido por el switch.
Bucle while
Las sentencias de bucles, son clasificadas como sentencias de iteración. Las sentencias serán
ejecutadas a la medida en que sea verdadera la expresión booleana, solo dejarán de ejecutarse
cuando esta expresión sea falsa. La expresión puede nunca ser verdadera, en ese caso se ejecutarán
las sentencias que están dentro del ciclo.
while (expresionBooleana)
{
sentencias;
}
Bucle do-while
La única diferencia con el bucle while es que el bucle do-while ejecuta al menos una vez las
sentencias, aunque desde el principio la expresión booleana sea falsa.
do
{
sentencias;
} while(expresionBooleana);
Bucle for
Sentencia break
La sentencia break puede encontrarse dentro del alcance de un ciclo. Generalmente se encuentra
dentro de una bifurcación, tal que si una condición booleana se cumple si ejecutará el break y saldrá
del alcance del ciclo.
Si bien se escribe de la misma forma que el break del switch, su funcionamiento es distinto dado
que no salta al siguiente paso, sino que corta la ejecución del ciclo, sin importar el estado de verdad
o falsedad de la expresión booleana, y lo deja sin efecto.
Sentencia continue
Moreno (2000) indica que debe tomarse muy en cuenta que antes de la ejecución de un continue
debe haberse logrado reducir la complejidad del algoritmo, ya que, al saltar a la próxima iteración, si
la expresión booleana sigue en la misma condición y no se ha reducido la complejidad, puede
generarse un ciclo infinito de ejecución.
Tipo_de_variable[ ] Nombre_del_array;
El tipo de variable puede ser cualquiera de los admitidos por Java y que ya hemos explicado.
Ejemplos de declaración e inicialización con valores por defecto de arrays usando todos los tipos de
variables Java, serían:
De la misma forma procederíamos para el tipo float, pero teniendo en cuenta que los números
deberán llevar al final la letra “f” o “F”. Por ejemplo 1.73f o 1.73F.
Para cadenas
Para caracteres
Para booleanos
Arreglos Bidimensional
Es muy común llamarles arreglos bidimensionales, arreglos 2d, o matrices, pero en realidad, se
tratan de un arreglo de arreglos. Sólo que, para su manipulación lógica, ha sido más conveniente
pensar en ellos como una tabla de valores.
Como puedes observar ahora tenemos dos dimensiones: el número de renglones y el número de
filas del arreglo.
Al igual que los arreglos unidimensionales, el proceso de declaración y construcción puede realizarse
en una sola sentencia o en dos. En la figura 3 puedes ver la instrucción que crea una matriz.
Al igual que los arreglos unidimensionales, las dimensiones de una matriz deben:
También pueden expresarse como una constante simbólica, ya sea las dos dimensiones o
sólo una de ellas.
En primer lugar, un objeto no es un dato simple, sino que contiene en su interior cierto
número de componentes bien estructurados.
En segundo lugar, cada objeto no es un ente aislado, sino que forma parte de una
organización jerárquica o de otro tipo.
Todas las acciones de los programas Java se colocan dentro del bloque de una clase o un objeto.
Todos los métodos se definen dentro del bloque de la clase, Java no soporta funciones o variables
globales. Esto puede despistar a los programadores de C++, que pueden definir métodos fuera del
bloque de la clase, pero esta posibilidad es más un intento de no separarse mucho y ser compatible
con C, que un buen diseño orientado a objetos. Así pues, el esqueleto de cualquier aplicación Java
se basa en la definición de una clase.
Todos los datos básicos, como los enteros, se deben declarar en las clases antes de hacer uso de ellos.
En C la unidad fundamental son los ficheros con código fuente, en Java son las clases. De hecho,
son pocas las sentencias que se pueden colocar fuera del bloque de una clase. La palabra clave
Tipos de Clases
Hasta ahora sólo se ha utilizado la palabra clave public para calificar el nombre de las clases que
hemos visto, pero hay tres modificadores más. Los tipos de clases que podemos definir son:
Abstract
Una clase abstract tiene al menos un método abstracto. Una clase abstracta no se instancia, sino que
se utiliza como clase base para la herencia.
Final
Una clase final se declara como la clase que termina una cadena de herencia. No se puede heredar
de una clase final. Por ejemplo, la clase Math es una clase final.
Public
Las clases public son accesibles desde otras clases, bien sea directamente o por herencia. Son
accesibles dentro del mismo paquete en el que se han declarado. Para acceder desde otros paquetes,
primero tienen que ser importadas.
Synchronizable
Este modificador especifica que todos los métodos definidos en la clase son sincronizados, es decir,
que no se puede acceder al mismo tiempo a ellos desde distintos threads; el sistema se encarga de
colocar los flags necesarios para evitarlo. Este mecanismo hace que desde threads diferentes se
puedan modificar las mismas variables sin que haya problemas de que se sobrescriban.
Una clase en Java puede contener variables y métodos. Las variables pueden ser tipos primitivos
como int, char, etc. Los métodos son funciones.
Por ejemplo:
Métodos
Los métodos son funciones que pueden ser llamadas dentro de la clase o por otras clases. El
constructor es un tipo específico de método que siempre tiene el mismo nombre que la clase.
Cuando se declara una clase en Java, se pueden declarar uno o más constructores opcionales que
realizan la inicialización cuando se instancia (se crea una ocurrencia) un objeto de dicha clase.
Utilizando el código de ejemplo anterior, cuando se crea una nueva instancia de MiClase, se crean
(instancian) todos los métodos y variables, y se llama al constructor de la clase:
MiClase mc;
mc = new MiClase();
La palabra clave new se usa para crear una instancia de la clase. Antes de ser instanciada con new no
consume memoria, simplemente es una declaración de tipo. Después de ser instanciado un nuevo
objeto mc, el valor de i en el objeto mc será igual a 10. Se puede referenciar la variable (de instancia)
i con el nombre del objeto:
Al tener mc todas las variables y métodos de MiClase, se puede usar la primera sintaxis para llamar
al método Suma_a_i() utilizando el nuevo nombre de clase mc:
mc.Suma_a_i( 10 );
Finalizadores
Java no utiliza destructores (al contrario que C++) ya que tiene una forma de recoger
automáticamente todos los objetos que se salen del alcance. No obstante, proporciona un método
que, cuando se especifique en el código de la clase, el reciclador de memoria (garbage collector)
llamará:
Ejemplo de Método:
En el siguiente código se incluye un ejemplo de método que no devuelve un valor (de tipo void):
/**
* Demostración del método tabla
*/
public class PruebaTabla
{
public static void main (String [] args)
{
tabla(4);
tabla(7);
}
public static void tabla (int n)
{
// ejemplo de llamada
// de tipo void
System.out.println("Tabla de multiplicar del número " + n);
for (int i=0; i<=10; i++)
System.out.println(n + " x " + i + " = " + producto(n, i));
return; // No devuelve ningún valor
}
public static int producto (int a, int b)
{
return a*b;
}
Recursión de Métodos
/**
* Demostración de la función recursiva factorial
*/
public class PruebaFactorialR
{
public static void main (String [] args)
{
for (int i=1; i<=20; i++)
System.out.println("Factorial de " + i + " = " + factorialR(i));
}
public static long factorialR (int n)
{
if (n==0)
return 1;
else
return n * factorialR(n-1);
}
}
En la construcción de métodos recursivos es importante evitar el problema de la recursión infinita.
Es decir, que, en algún caso, la ejecución del método definido de forma recursiva no implique una
nueva llamada al propio método.
Métodos de Instancias
Ejemplo:
Métodos de Clase
Los métodos de clase son un comportamiento común a todas las instancias que pertenecen a la
misma clase. Al ser un método de clase, no hace falta instanciar un objeto de la clase para utilizarlo.
Estos métodos no hablan del estado actual de la clase, sino solo de un comportamiento genérico de
la clase, de un procedimiento que solo utiliza los parámetros de entrada o las variables estáticas. Son
para un uso particular y es bien visible cuando un método debe ser estático.
Ejemplo:
Un objeto en Java cumple las funciones que realizan un record en Pascal o una estructura en C. En
Java las variables sólo pueden contener referencias a objetos, es decir punteros a objetos.
Un objeto posee variables de instancia o campos que se pueden consultar o asignar. Los campos que
posee un objeto se definen al momento de declarar la clase a la cual pertenece:
class A { int x, y; }
A a= new A();
a.x= 1;
a.y= 2;
System.out.println(a.x+" "+a.y); // 1 2
class A
{
int x, y; // variables de instancia
// Métodos
void Set(int vx, int vy) { x= vx; y= vy; }
void Incx() { x++; }
void Print() { System.out.println(x+" "+y); }
}
A a= new A();
a.Set(10, 20);
a.Print(); // 10 20
a.Incx();
a.Print(); // 11 20
Incx(); // error, falta indicar el objeto
A a2= new A();
a2.Set(5, 6);
a2.Print(); // 5 6
a.Print(); // 11 20
tipo-retorno nombre-método
{instrucciones}
En este caso las variables a2 y a3 referencian el mismo objeto, mientras que a1 y a2 referencian
objetos distintos.
Una referencia puede ser pasada como argumento y puede ser retornada por un método.
class A
{
...
void CopyFrom(A from) { x= from.x; y= from.y }
A MakeCopy()
{
A acopy= new A();
acopy.Set(x, y);
return acopy;
}
}
A a1= new A();
a1.Set(1,2);
A a2= new A();
a2.CopyFrom(a1);
a2.IncX();
a2.Print(); // 2 2
a1.Print(); // 1 2
A a3=a1.MakeCopy();
a3.Print(); // 1 2
Dentro de un método, el identificador this contiene una referencia al objeto con que se invocó este
método.
En Java no existe enlace directo entre identificador y objeto como en C o Pascal. Las variables se
pueden inicializar con la referencia nula:
A a;
a= null;
a.x= 0; // error, a es la ref. nula
class Eslabon
{
Eslabon next;
A a;
void Encadenar(Eslabon anext) { next= anext; }
}
...
for (Eslabon e= prim; e!=null; e= e.next)
e.a.Print();
String s= null;
s.substring(1,2); // error
int[] a= null;
a[0]=0; // error
A a= new A();
a= new A();
Prerrequisitos
Crear una clase en Java de nombre "Animal", dentro del paquete "misClases" con los atributos raza, nombre y
edad, adicionalmente un constructor que reciba el nombre y lo asigna al animal y tres métodos encargados de
obtener y establecer la edad del animal y el restante para obtener el nombre.
En el ejemplo de la clase PruebaPrecio, que utiliza una instancia de la clase Precio, la llamada al
constructor se produce en la sentencia p = new Precio();. Mientras que la ejecución de new genera
una nueva instancia y devuelve su dirección de memoria, la ejecución del constructor Precio()
inicializa los valores de los atributos.
Declaración de un constructor
/**
* Declaración de la clase Fecha
*/
public class Fecha
{
// Atributos o variables miembro
private int dia;
private int mes;
private int anho;
/**
* Constructor 1
* Asigna los valores 1, 1 y 2000 a los atributos
* día, mes y año respectivamente
*/
public Fecha()
{
this.dia = 1;
this.mes = 1;
this.anho = 2000;
}
/**
* Constructor 2
* @param ndia el día del mes a almacenar
* @param nmes el mes del anho a almacenar
* @param nanho el anho a almacenar
*/
public Fecha(int dia, int mes, int anho)
{
this.dia = dia;
this.mes = mes;
this.anho = anho;
}
public String toString()
{
return this.dia + "/" + this.mes + "/" + this.anho;
La sobrecarga permite que puedan declararse varios constructores (con el mismo identificador que
el de la clase), siempre y cuando tengan un tipo y/o número de parámetros distinto. Para probar el
código anterior, se construye el siguiente programa:
/**
* Ejemplo de uso de la clase Fecha
*/
public class PruebaFecha
{
public static void main (String [] args)
{
Fecha origen = new Fecha();
Fecha actual = new Fecha(16,2,2009);
System.out.println("Primera fecha: " + origen.toString());
System.out.println("Segunda fecha: " + actual.toString());
}
}
Sobrecarga de métodos
Java permite asignar el mismo identificador a distintos métodos, cuya diferencia reside en el tipo o
número de parámetros que utilicen. Esto resulta especialmente conveniente cuando se desea llevar a
cabo la misma tarea en diferente número o tipos de variables. La sobrecarga (overloading) de los
métodos puede resultar muy útil al efectuar llamadas a un método, ya que en lugar de tener que
recordar identificadores de métodos distintos, basta con recordar uno sólo. El compilador se
encarga de averiguar cuál de los métodos que comparten identificador debe ejecutar. Por ejemplo:
/**
* Demostración de métodos sobrecargados * A. Garcia-Beltran - marzo, 2002
*/
Ejemplo de sobrecarga
En este ejemplo, se ha creado dos métodos sobrecargados, primero método de la suma realiza una
suma de dos números y segundo método de la suma se realiza la adición de tres números:
class Calculation
{
void sum(int a,int b){System.out.println(a+b);}
void sum(int a,int b,int c){System.out.println(a+b+c);}
public static void main(String args[])
{
Calculation obj=new Calculation();
obj.sum(10,10,10);
obj.sum(20,20);
}
}
Encapsulamiento
En encapsulamiento es un principio del lenguaje Java cuya filosofía es hacer que los atributos de las
clases se puedan editar sólo a través de métodos. De manera general, se hace teniendo las
propiedades como privadas y métodos que la controlan públicos. Comúnmente, se crean un grupo
de métodos llamados getters (se encargan de obtener el valor de la propiedad) y setters (se encargan
de setearla).
Moreno (2000) explica que mantener las clases con el principio de encapsulamiento nos permite
controlar el cambio de valor que pueda producirse en ellas añadiendo validaciones. De cualquier
Ejemplo:
g.setPatas(10);
g.setPatas(-50);
Por lo tanto, se da la idea de actualizar el método «setPatas» de nuestra clase Gato para que quede
así:
Con esta actualización del método, el segundo (tercer, cuarto, quinto...) equipo que use nuestra
clase gato, no va a variar su código (estabilidad), seguirá llamando al método setPatas
(mantenibilidad), y nosotros controlaremos que el número sea entre 0 y 4 (seguridad). Si volvemos a
la primera versión de la clase, no nos permitiría añadir este tipo de controles a posteriori sin hacer
cambiar todos los usos de nuestra clase.
Canchala (2012) expresa que, aunque parezca un ejemplo tonto (y un poco cruel para los gatos) no
es raro en Java encontrarte que tienes que trabajar con librerías que no conoces, que respetan el
principio de encapsulamiento y que gracias a él puedes hacer un correcto funcionamiento de la
misma, ya que controlará que no te salgas del tiesto, con valores inválidos, errores o incluso
validando los datos con los que se crea.
UML se puede usar para modelar distintos tipos de sistemas como, por ejemplo: sistemas de
software, sistemas de hardware, y organizaciones del mundo real. UML ofrece nueve diagramas en
los cuales modelar sistemas. Es un lenguaje muy expresivo, que cubre todas las vistas necesarias para
desarrollar y luego desplegar tales sistemas.
UML es sólo un lenguaje y por tanto es tan solo una parte de un método de desarrollo de software,
además, es independiente del proceso, aunque para utilizar óptimamente se debería usar en
procesos que fuesen dirigidos por los casos de uso, centrados en la arquitectura, lo interactivo e
incremental. (Qué Es UML? | LENGUAJE DE MODELADO UNIFICADO UML, n.d.)
Diagrama de Clases
UML está compuesto por diversos elementos gráficos que se combinan para conformar diagramas.
Al ser UML un lenguaje, existen reglas para combinar dichos elementos. En conjunto, los
diagramas UML brindan diversas perspectivas de un sistema, por ende, el modelo. Ahora bien, el
modelo UML describe lo que hará el sistema y no como será implementado. (Programación, 2012)
Si se observa alrededor, se visualizan una serie de cosas (objetos), los cuales tienen atributos
(propiedades) y nos damos cuenta que algunos realizan acciones (métodos). Esas cosas,
naturalmente se agrupan en categorías (automóviles, viviendas, entre otros). Una clase es una
categoría de cosas u objetos que poseen atributos y acciones similares.
Los diagramas de clases representan las clases intervinientes en el sistema, destacando con que otras
clases se relacionan y como lo hacen.
Interacción de clases
Relaciones
Los tipos más importantes de relaciones estáticas entre clases son los siguientes:
Cada asociación puede presentar elementos adicionales que doten de mayor detalle al tipo de
relación:
La generalización define una superclase a partir de otras. Por ejemplo, de las clases profesor y
estudiante se obtiene la superclase persona. La especialización o especificación es la operación
inversa, y en ella una clase se descompone en una o varias subclases. Por ejemplo, de la clase
empleado se pueden obtener las subclases secretaria, técnico e ingeniero.
Dependencia. - Una relación de dependencia se utiliza entre dos clases o entre una clase y una
interfaz, e indica que una clase requiere de otra para proporcionar alguno de sus servicios.
Interfaces
Paquetes
Los paquetes se usan para dividir el modelo de clases del sistema de información, agrupando clases
u otros paquetes según los criterios que sean oportunos. Las dependencias entre ellos se definen a
Notación de Clases
Una clase se representa como una caja, separada en tres zonas por líneas horizontales.
En La zona central contiene una lista de atributos, uno en cada línea. La notación utilizada para
representarlos incluye, dependiendo del detalle, el nombre del atributo, su tipo y su valor por
defecto, con el formato:
La visibilidad será́ en general publica (+), privada (-) o protegida (#), aunque puede haber otros tipos
de visibilidad dependiendo del lenguaje de programación empleado.
En la zona inferior se incluye una lista con las operaciones que proporciona la clase. Cada
operación aparece en una línea con formato:
La visibilidad será́ en general publica (+), privada (-) o protegida (#), aunque como con los atributos,
puede haber otros tipos de visibilidad dependiendo del lenguaje de programación. La lista de
parámetros es una lista con los parámetros recibidos en la operación separados por comas. El
formato de un parámetro es:
Relaciones
Una relación de asociación se representa como una línea continua entre las clases asociadas. En una
relación de asociación, ambos extremos de la línea pueden conectar con la misma clase, indicando
que una instancia de una clase, está asociada a otras instancias de la misma clase, lo que se conoce
como asociación reflexiva.
La relación puede tener un nombre y un estereotipo, que se colocan junto a la línea. El nombre
suele corresponderse con expresiones verbales presentes en las especificaciones, y define la
semántica de la asociación. Los estereotipos permiten clasificar las relaciones en familias y se
escribirán entre el símbolo: << ... >>.
Agregación. - Se representa con un rombo hueco en la clase cuya instancia es una agregación
de las instancias de la otra.
Composición. - Se representa con un rombo lleno en la clase cuya instancia contiene las
instancias de la otra clase.
Dependencia. - Una línea discontinua con una flecha apuntando a la clase cliente. La
relación puede tener un estereotipo que se coloca junto a la línea, y entre el símbolo: << ...
>>.
Herencia. - Esta relación se representa como una línea continua con una flecha hueca en el
extremo que apunta a la superclase.
Interfaces
Una interfaz se representa como una caja con compartimentos, igual que las clases. En la zona
superior se incluye el nombre y el estereotipo <>. La lista de operaciones se coloca en la zona
inferior, igual que en las representaciones de clases. La zona en la que se listan los atributos estará
vacía o puede omitirse.
Existe una representación más simple para la interfaz: un círculo pequeño asociado a una clase con
el nombre de la interfaz debajo. Las operaciones de la interfaz no aparecen en esta representación; si
se quiere que aparezcan, debe usarse la primera notación.
Entre una clase que implementa las operaciones que una interfaz ofrece y esa interfaz se
establece una relación de realización que, dependiendo de la notación elegida, se
representará con una línea continua entre ellas cuando la interfaz se representa como un
Ejemplo: Estudio del sistema encargado de la gestión de préstamos y reservas de libros y revistas de
una biblioteca. Dependiendo del momento del desarrollo el diagrama estará́ más o menos detallado.
Así́, el diagrama tendría la siguiente estructura en el proceso de análisis.
Persona.java (contiene)
Public class Persona
{
Private String nombre; //propiedad
Private int edad; // propiedad
Public Persona() { //constructor}
Public int getEdad()
{ //asesor a edad
Return edad;
}
Public void setEdad (int val)
{ //mutador de edad
This.edad =val;
Estudiante.java (contiene)
Profesor.java (contiene)
Package personas;
Import Clases.*;
Public class Main()
{
Public stactic void main (String[] args )
{
Persona p= new Persona();
p.setNombre(“Walter”);
p.setEdad(25);
Estudiante e = new Estudiante();
e.setNombre(“Javier López”);
e.setLegajo(223015);
e.setCarrera(“TI”);
Profesor pro= new Profesor();
Pro.setNombre(“Wilson”);
Pro.setMateria(“POO”);
Pro.setCargo(“Tutor”);
System.out.println(“Objeto p de tipo persona”);
System.out.printf(“Nombre:%s, Edad: %d \n”, p.getNombre(), p.getEdad());
System.out.println(“Objeto e de tipo Estudiante”);
System.out.printf(“Nombre:%s, Carrera:%s, Legajo: %d \n”, e.getNombre(),
e.getCarrera(), e.getLegajo());
System.out.println(“Objeto pro de tipo Profersor”);
System.out.printf(“Nombre:%s, Materia: %s, Cargo=%s \n”,
pro.getNombre(), pro.getMateria(), pro.getCargo());
}
}
Como primer paso se instalará el JDK, para ello les ubico el siguiente enlace de descarga:
https://www.oracle.com/java/technologies/javase-downloads.html.
Una vez instalado el JDK, se procede a instalar el Apache Netbeans, en el siguiente enlace lo pueden
descargar: https://netbeans.apache.org/download/index.html.
Por último, se tendrá que instalar EasyUML en java, para ello revisar el siguiente enlace del video:
Qué es UML? | LENGUAJE DE MODELADO UNIFICADO UML. (n.d.). Retrieved May 3, 2020,
from http://stadium.unad.edu.co/ovas/10596_9839/qu_es_uml.html