Compendio-Modelo Poo U I
Compendio-Modelo Poo U I
EN LINEA
PROGRAMACIÓN ORIENTADA A OBJETOS (POO)
4 créditos
33
Titulaciones Semestre
CAFETERÍA VIRTUAL.
Tabla de contenido
1
Organización de la lectura para el estudiante por semana del compendio
Semanas Paginas
Semana 1 Página 1 – 10
Semana 2 Página 11 – 45
Semana 3 Página 46 – 58
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.
2
Objeto: Entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o
funcionalidad (métodos) los mismos que consecuentemente reaccionan a eventos. Se corresponde
con los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa). Es
una instancia a una clase.
Abstracción
Modularidad
3
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.
Modularidad. - Permite subdividir una aplicación en partes más pequeñas llamadas módulos, cada
una de las cuales debe ser tan independiente como sea posible de la aplicación en sí y de las partes
restantes.
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:
4
Propiedades del paradigma orientado a objeto
Imperativo
Orientado
a objeto
Paradigma Imperativo. - Contienen instrucciones que dicen al ordenador cómo realizar una tarea.
Los primeros lenguajes imperativos fueron los códigos máquina de los ordenadores, que utilizaban
instrucciones sencillas y permitían implementar el hardware fácilmente, pero no servían para
desarrollar programas complejos. El primer lenguaje imperativo que posibilitó la creación de
programas con un nivel de complejidad elevado fue FORTRAN. Hoy en día está representado por
los lenguajes de programación BASIC, C ó PASCAL, entre otros.
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)
5
Paradigma Lógico. - La programación lógica comprende la programación declarativa y la funcional.
El proceso de elaboración de programas está basado en la lógica de primer orden y, a diferencia de
los demás paradigmas, especifica qué debe hacer el programa y no cómo hacerlo. Se emplea en
aplicaciones de inteligencia artificial. El lenguaje de programación lógica por excelencia es
PROLOG.
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.
6
Figura 1. Diagrama API de conexión de datos (Azpitarte et al., 2009)
Comprueba tu aprendizaje
1. Son aquellos cuyas sentencias están formadas por códigos nemotécnicos (abreviaturas de
palabras en inglés).
Lenguaje maquina
Lenguaje de programación
Lenguaje Ensamblador
Programación Lineal
7
Paradigma imperativo
Paradigma lógico
3. Tienen origen en Simula 67, un lenguaje diseñado para hacer simulaciones, creado por
Ole-Johan Dahl y Kristen Nygaard del Centro de Cómputo Noruego en Oslo.
Programación Lineal
Programación Lógica
POO
Programación imperativa
Programación Lógica
Programación estructurada
Programación Lineal
Lenguaje maquina
Lenguaje de programación
Lenguaje Ensamblador
8
interdependientes programados y compilados por separado. Un método un poco más
sofisticado es la programación por capas, en la que los módulos tienen una estructura
jerárquica muy definida y se denominan capas.
Desventaja de la programación
Paradigma Funcional
Paradigma imperativo
Paradigma lógico
Paradigma de programación
Paradigma lógico
Paradigma imperativo
Paradigma Funcional
9
Paradigma Orientado a objetos
Paradigma imperativo
Paradigma lógico
10. Son aquellos que poseen sentencias formadas por palabras similares a las de los lenguajes
humanos.
Lenguaje maquina
Lenguaje de programación
11. Son un conjunto de reglas, herramientas y condiciones que admiten crear programas o
aplicaciones dentro de una computadora.
Lenguaje maquina
Lenguaje de programación
Lenguaje Ensamblador
10
Tema 2: Fundamentos de la programación orientada a objetos
Antes de empezar a desarrollar las características propias de la programación orientada a objeto,
conviene hacer una revisión de alto nivel de la programación, sus fases y sus diferentes métodos.
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
11
que ambos tienen unas características comunes como son poseer ruedas, un volante, asientos, Esas
características comunes son las que hacen pensar en el concepto coche en ambos casos. A partir de
ahora podemos interpretar que el BMW y el SEAT son objetos, y el tipo o clase, de esos objetos es
coche.
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
12
la clase y no devuelve ningún valor. Análogamente destructor es un método perteneciente a una
clase que es ejecutado de forma automática cuando un objeto es destruido. Java no soporta los
destructores. Es posible que exista más de un constructor en una clase, diferenciados sólo en los
parámetros que recibe, pero en la instanciación sólo será utilizado uno de los constructores.
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.
13
Independiente a la arquitectura y portable. - Al compilar un programa en Java, el código resultante
es un tipo de código binario conocido como Java bytecodes. Este código es interpretado por
diferentes computadoras de igual manera, por lo que únicamente hay que implementar un
intérprete para cada plataforma. De esa manera Java logra ser un lenguaje que no depende de una
arquitectura de ordenador específica. Como el código compilado de Java es interpretado, un
programa compilado de Java puede ser utilizado por cualquier computadora que tenga
implementado el intérprete de Java.
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.
14
Es un lenguaje seguro: La máquina virtual al ejecutar el código java realiza comprobaciones
de seguridad, además el propio lenguaje carece de características inseguras, como por
ejemplo los punteros.
Gracias al API de java podemos ampliar el lenguaje para que sea capaz de, por ejemplo,
comunicarse con equipos mediante red, acceder a bases de datos, crear páginas HTML
dinámicas, crear aplicaciones visuales al estilo windows,
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:
15
public class TablaMultiplicar
{
public static void main (String arg[])
{
}
}
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).
16
}
}
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
17
float Punto flotante 32-bit IEEE 754
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
18
Expresiones de creación de objetos
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.
19
Expresiones y estructuras de control
JAVA al igual que C y C++ utiliza las estructuras de control if-else, while, do-whiel y como selector
de opciones la estructura switch. Las estructuras de control rigen en su ejecución a partir de una
condición del tipo boolean, es decir, el resultado de operadores lógicos o el resultado de un método
que retorne un valor de verdad, verdadero o falso
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;
20
default: setencias4; 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
21
El bucle for permite en un principio una inicialización, luego itera comenzando con una evaluación
de la expresión booleana y por último realiza algún tipo de paso a próximo, o reducción de la
complejidad del algoritmo, en camino hacia convertir la expresión booleana en falso. Se ejecutan las
sentencias, mientras la expresión booleana se mantenga en un estado de verdadero por cada paso.
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.
22
Arreglos de una y dos dimensiones
Arreglos unidimensionales
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:
23
De la misma forma procederíamos para los otros tipos de enteros: byte, short, long.
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.
24
Figura 2: Declaración de un arreglo bidimensional
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.
25
La primera dimensión se refiere al total de renglones de la matriz, y la segunda se refiere al
total de columnas.
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
import (equivalente al #include) puede colocarse al principio de un fichero, fuera del bloque de la
26
clase. Sin embargo, el compilador reemplazará esa sentencia con el contenido del fichero que se
indique, que consistirá, como es de suponer, en más clases.
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:
27
La clase MiClase contiene una variable (i) y dos métodos, MiClase que es el constructor de la clase y
Suma_a_i( int j ).
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
28
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
}
29
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);
}
}
30
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
Los métodos de instancia, como su nombre lo indica, son aplicables a una instancia de la clase en
particular. Es decir, que un método de instancia trabaja sobre el estado actual de la instancia, y para
cada instancia tendrán un resultado distinto, por ejemplo, el hecho de comer permitirá a la
instancia mario estar satisfecho, mientras que la instancia maria estará insatisfecha hasta que
también se le aplique el método comer.
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:
31
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.
A es el tipo del objeto creado. También se dice que A es la clase del objeto o que el objeto es una
instancia de la clase A. La variable a1 también es de tipo A, o análogamente a1 es de la clase A,
porque a1 debe contener siempre referencias a objetos que pertenecen a la clase A.
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
32
(tipo-parámetro nombre, ...)
{instrucciones}
Si el procedimiento no retorna nada se coloca void. En las instrucciones las variables que se acceden
que no sean parámetros o variables locales del procedimiento deben ser variables de instancia del
objeto.
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
33
Dentro de un método, el identificador this contiene una referencia al objeto con que se invocó este
método.
class A
{
...
void CopyTo(A to)
{ to.CopyFrom(this); }
}
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
34
Ningún objeto se destruye explícitamente: No hay free ni delete
A a= new A();
a= new A();
Azpitarte (2015) demuestra que el objeto que se creó primero ya no es alcanzable y por lo tanto el
recolector de basura recuperará el espacio que ocupa.
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.
35
return 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.
36
{
Precio p; // Crea una referencia de la clase Precio
p = new Precio(); // Crea el objeto de la clase Precio y realiza
// una llamada al método constructor
}
}
Declaración de un constructor
La declaración de un constructor diferente del constructor por defecto, obliga a que se le asigne el
mismo identificador que la clase y que no se indique de forma explícita un tipo de valor de retorno.
La existencia o no de parámetros es opcional. Por otro lado, 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. Por ejemplo, para la clase Fecha se declaran dos
constructores, el primero sin parámetros (por lo tanto, se redefine el constructor por defecto) y el
segundo con tres parámetros:
/**
* 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
*/
37
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
38
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
*/
39
}
public Arboles(int altura)
{
System.out.println("Un árbol de " + altura + " metros");
}
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);
}
}
40
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
manera, es una convención dentro de la programación orientada a objetos, aunque no se esté
realizando una operación adicional al cambio de valor.
Ejemplo:
41
//Mi método main...
Gato g = new Gato();
g.setNombre("Nemo");
g.setPatas(3);
System.out.println("Mi gato se llama: " + g.getNombre());
System.out.println("El número de patas de mi gato es: " + g.getPatas());
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
42
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.
Comprueba tu aprendizaje
Clase
Objeto
Polimorfismo
Método
Objeto
Método
Clase
Polimorfismo
Método
43
Objeto
Clase
Herencia
4. Contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace
los datos visibles desde fuera del objeto, y cuyo valor puede ser alterado por la ejecución
de algún método.
Atributo
Estado
Comportamiento
Evento
Verificar cuáles son los valores que se pueden almacenar en las variables de tipo: int, byte,
short, long doublé, etc. En la siguiente tabla cite un ejemplo de un valor que se pueda
almacenar y otro que no en una variable declarada.
44
2 Febrero Invierno
3 Marzo Primavera
4 Abril Primavera
5 Mayo Primavera
6 Junio Verano
7 Julio Verano
8 Agosto Verano
9 Septiembre Otoño
10 Octubre Otoño
11 Noviembre Otoño
12 Diciembre Invierno
45
Tema 3: UML
Introducción a UML
El Lenguaje Unificado de Modelado (Unifield Modeling Lenguaje UML), es un lenguaje estándar
para escribir planos de software, UML se puede utilizar para visualizar, especificar, construir y
documentar los artefactos de un sistema que involucra una gran cantidad de software. UML
prescribe un conjunto de notaciones y diagramas estándar para modelar sistemas orientados a
objetos, y describe la semántica esencial de lo que estos diagramas y símbolos significan.
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)
46
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.
Por ejemplo: la clase lavadora tiene las propiedades fabricante, número de serie y realiza las acciones
de remojo, lavado, enjuague y centrifugado.
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
47
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.
48
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
partir de las relaciones establecidas entre los distintos elementos que se agrupan en estos paquetes
(ver Diagrama de paquetes).
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:
49
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:
La notación especificada se puede simplificar según el nivel de detalle con el que se quiera trabajar
en un momento dado.
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: << ... >>.
50
Navegabilidad. - La navegación desde una clase a la otra se representa poniendo una flecha
sin relleno en el extremo de la línea, indicando el sentido de la navegación.
Rol o nombre de la asociación: Este nombre se coloca junto al extremo de la línea que está
unida a una clase, para expresar cómo esa clase hace uso de la otra clase con la que mantiene
la asociación.
Además, existen notaciones específicas para los otros tipos de relación, como son:
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
51
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
círculo y con una flecha hueca discontinua apuntando a la interfaz cuando se represente
como una clase. (Diagrama de Clases - Manuel.Cillero.Es, n.d.)
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.
52
Ejemplo de UML
53
Detalle del código generado automáticamente
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)
54
Public void setLegajo(int val)
{ //mutador de legajo
This.legajo=val;
}
}
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”);
55
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());
}
}
Comprueba tu aprendizaje
56
Escriba una versión en Java de la clase Producto. Incluya métodos que permitan acceder a la
información del producto.
2. Una persona tiene un nombre, dos apellidos, una fecha de nacimiento, un sexo y un
número de identificación. Define las clases y los atributos correspondientes.
3. Escriba el código correspondiente al siguiente diagrama de clases.
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.
57
Videos: En el siguiente enlace se muestra una explicación sobre la instalación
de JDK.
- https://www.youtube.com/watch?v=kPWezAZGPks.
58
Una vez instalado el JDK, se procede a instalar el Visual Studio Code o Netbeans, en el siguiente
enlace lo pueden descargar: https://code.visualstudio.com/. o
https://netbeans.apache.org/download/index.html.
Por último, se tendrá que instalar el plugin de Diagramas.net en VS Code, para ello revisar el
siguiente enlace del video:
Bibliografía
Azpitarte, R. L., Llinares, J. D., & Goterris, F. T. (2009). Introducción a la Programación Orientada a
Objetos con Java.
59
Morero, F. (2000). Desarrollo de software Introducción a la OOP. Eidos.
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
60