Documentos de Académico
Documentos de Profesional
Documentos de Cultura
TEMA 1. INTRODUCCIÓN
HISTORIA DE LA PROGRAMACIÓN.
Un objeto se puede ver como una "cápsula" de datos y algoritmos que trabajan sobre
esos datos. Un objeto no puede acceder directamente a sus datos (atributos). Los
atributos son sólo accesibles desde la implementación de los métodos de una clase. Un
objeto no puede "manipular" sus propios datos, para ello están los métodos de la clase de
dicho objeto: el comportamiento (métodos) de un objeto puede variar el valor (estado) de
sus datos (atributos). Por ejemplo, nunca debemos hacer lo siguiente:miCoche.color :=
'rojo'. Para esto definiremos métodos que actualicen el valor de los atributos de un objeto,
por ejemplo: miCoche.ponerColor('rojo').
LA CLASE.
Describe a qué operaciones responden los objetos de una clase (cómo se comportan los
objetos). En esta parte de la clase se declaran las cabeceras de los métodos de la clase
que podrán ser "invocados" por los objetos. Es decir, si un método se declara en la parte
pública, podrá ser "invocado" por un objeto de dicha clase, de lo contrario no podrá ser
"invocado" por un objeto. Es la parte "visible" de la clase, la interfaz de la clase.
Parte privada
Describe los datos de la clase y cómo las operaciones manipulan dichos datos. Esta parte
de la clase es donde se oculta (encapsula) la información de la clase: datos e
implementación de métodos declarados o no en la parte pública de la clase. Es una parte
"no visible", cada objeto de una determinada clase tiene sus atributos (datos) y sus
métodos.
LA ABSTRACCIÓN.
POLIMORFISMO.
Veamos el siguiente ejemplo, en el que se define una clase forma de la que se heredan
las clases círculo y cuadrado.
La clase forma define los métodos dibujar y borrar. En la definición de estos métodos se
implementará el código común a todos los objetos de la clase. Sin embargo cuando
definamos las clases hijas, círculo y cuadrado, será necesario modificar estos métodos
para adaptarlos a las nuevas subclases. El método de la clase padre implementa aquellas
acciones comunes. Las clases hijas añaden las operaciones particulares que necesiten.
Cuando utilicemos los métodos de la clase forma no tendremos que hacer distinción entre
cuadrados y círculos. Gracias al polimorfismo se ejecutará el método adecuado en función
de la subclase a la que pertenezca el objeto.
Simula (1967) es aceptado como el primer lenguaje que posee las características
principales de un lenguaje orientado a objetos. Fue creado para hacer programas de
simulación, en donde los "objetos" son la representación de la información más
importante. Smalltalk (1972 a 1980) es posiblemente el ejemplo canónico, y con el que
gran parte de la teoría de la programación orientada a objetos se ha desarrollado.
ENCAPSULAMIENTO.
Imaginemos que se crea una clase, una docena de programadores tienen acceso a dicha
clase y la utilizan a discreción, posteriormente dicha clase comienza a comportarse de
una manera inesperada debido a que los valores que algunas variables han tomado no
fueron anticipados y todo comienza a desmoronarse. Para corregir el problema se crea
una versión más nueva de dicha clase y listo.
FLUJOS DE CONTROL.
Un programa java está compuesto por una serie de sentencias. Las dos sentencias
básicas en el lenguaje Java se reflejan en la siguiente tabla:
sentencias de que son las que hemos estudiado para declarar variables y
declaración constantes.
Expresión de asignación, a = b+c;
Formas prefijas o posfijas de ++ y --, contador++;
Llamadas a métodos, Objeto1.mimetodo();
sentencias de expresión
Expresiones de creación de objetos
Sentencias de control
Estas últimas son las que controlan el flujo de ejecución del programa. Normalmente el
orden de ejecución de sentencias es el mismo en el que están escritas. Sin embargo, las
sentencias de control de flujo introducen bifurcaciones en la ejecución del programa.
Vimos como los elementos principales de una clase son sus atributos (datos) y sus
métodos (código para manipular los datos). Veamos una clase simple, Publicacion que
podríamos utilizar para almacenar los datos sobre nuestra colección bibliográfica:
El nombre de la clase, Publicacion debe ser un identificador válido en Java y por
convención, empieza por letra mayúscula. Una declaración de clase crea un nombre de
tipo en Java. De esta forma las referencias a objetos Publicacion se pueden declarar con
un simple:
Las variables de una clase se llaman campos. La clase Publicacion tiene tres campos,
idPublicacion que identifica de forma unívoca cada publicación, titulo que es el título de la
publicación y autor que ha firmado la publicación.
Podríamos definir un campo propietario. Con este campo indicaríamos el propietario del
libro. Sería útil, si sólo vamos a almacenar nuestras publicaciones, que el valor de este
campo lo compartan todas los objetos que podamos definir a partir de esta clase.
Calificaríamos la declaración de este campo con la palabra reservada static:
Método Descripción
private Un miembro privado es accesible sólo para la clase en la que está definido.
La propia clase, las subclases y todas las clases dentro del mismo paquete
protected
tienen acceso a los miembros calificados con este método de acceso.
public Todas las clases tienen acceso a los miembros públicos de la clase.
package Sólo las clases del mismo paquete que la clase tienen acceso a los miembros
ESTRUCTURA DE DATOS.
PILAS.
La pila es una secuencia de elementos del mismo tipo en la que el acceso a la misma se
realiza por un único lugar denominado cima:
Vemos como el acceso a los elementos de la pila se realiza siempre sobre un único
extremo. Las operaciones que caracterizan la pila son las de introducir un nuevo elemento
sobre la cima (push) y la de extraer el elemento situado en la cima (pop). Una forma de
ver esta estructura de datos es como una pila de libros en la que sólo se puede coger el
libro que está en la cima o apilar más libros sobre la misma, pero los libros que sostienen
la pila no son accesibles pues de otro modo todo se desmoronaría.
El interfaz en Java que define esta clase de objetos y sus métodos son los siguientes:
Pila.java
LISTAS.
Una lista es una secuencia de elementos dispuesto en un cierto orden, en la que cada
elemento tiene como mucho un predecesor y un sucesor. El número de elementos de la
lista no suele estar fijado, ni suele estar limitado por anticipado. Representaremos la
estructura de datos de forma gráfica con cajas y flechas. Las cajas son los elementos y
las flechas simbolizan el orden de los elementos.
["rojo","verde","azul","amarillo"]
Las listas admiten ciertas operaciones como son insertar un nodo adicional, borrar un
nodo, etc. En función de la forma de insertar nuevos elementos y acceder a los existente
tendremos distintos tipos de listas. Veamos ahora qué operaciones básicas se puedes
realizar sobre las listas. Se tratarán aquí las operaciones que permiten insertar y borrar
elementos únicamente al principio de la misma, por lo que las operaciones de acceso,
inserción y supresión de elementos en cualquier posición de la lista no se consideran
básicas pero podrán ser tratadas mediante recursión.
COLAS.
Los elementos de la cola se añaden y se eliminan de tal manera que el primero en entrar
es el primero en salir. La adición de elementos se realiza a través de una operación
llamada encolar (enqueue), mientras que la eliminación se denomina desencolar
(dequeue). La operación de encolar inserta elementos por un extremo de la cola,
mientras que la de desencolar los elimina por el otro.
Cola.java
ÁRBOLES.
Existe una jerarquía de nodos, de forma que a cada nodo hijo le llega una arista
de otro nodo padre. De esta forma se establece la relación padre-hijo: p es padre
de h, h es un hijo de p.
El nodo donde comienza la jerarquía se llama nodo raíz. A este nodo no llegan
arcos de ningún otro nodo, en otras palabras, no es hijo de ningún nodo padre.
Existe un camino único entre la raíz y cualquiera de los nodos del árbol
EXPLORACIÓN DE ÁRBOLES.
Los árboles son estructuras de datos usadas cuando se quieren manejar rápidamente
gran cantidad de datos. A menudo querremos realizar operaciones sobre los nodos del
árbol para lo que necesitaremos explorarlo. A pesar de la variedad de algoritmos, en
todos ellos deberemos visitar todos los nodos o lo que es lo mismo recorrer el árbol.
Desde un punto de vista intuitivo un grafo es un conjunto de nodos unidos por un conjunto
de arcos. Un ejemplo de grafo que podemos encontrar en la vida real es el de un plano de
trenes. El plano de trenes está compuesto por varias estaciones (nodos) y los recorridos
entre las estaciones (arcos) constituyen las líneas del trazado.
ALGORITMOS VORACES.
Tal y como indica su nombre estos algoritmos intentan buscar la solución desde el primer
momento. El enfoque que utilizan es ir construyendo la solución en cada paso.
Este tipo de algoritmos es muy empleado en los llamados problemas de optimización. Son
problemas que a partir de una colección de elementos tratan de obtener un subconjunto
de los mismo que optimice la consecución del objetivo. En algunos caso se trata de
obtener un orden entre los elementos de entrada con el fin de optimizar una medida.
Ejemplos de este tipo de problemas donde aplicar esta técnica son: