- Componentes
Básicos - Características
fundamentales de la POO - Características
Secundarias de la POO - Acceso a los miembros de una
clase - Métodos
Especiales - Orden de construcción de
los constructores cuando se hereda - Métodos
básicos - Ciclo de Vida de una
Thread - Finalización de
hilos
Programa: Los programas se
organizan como colecciones de objetos que colaboran entre si
enviándose mensajes.
- Objetos: Entidad de la vida real que tiene
atributos (datos) y
métodos
(operaciones)
que operan sobre esos atributos. A los datos que forman parte
del objeto se les conoce como datos miembros y a las
funciones
como funciones miembros. Los datos quedan ocultos al
programador y únicamente dispondrá de las
funciones para acceder a ellos. Es una abstracción que
se usa para representar una entidad real. Todo objeto tiene estado,
exhibe un comportamiento bien definido y posee identidad
única.Para crear objetos es necesario contar con otro
objeto que pueda crear objetos. El objeto creador de objetos
se llama clase y los objetos creados se llaman
instancias. Los objetos en Java se crean
en forma dinámica. No es necesario destruir un
objeto ya que java lo hace solo.- Clase: Modelo que
se usa para describir objetos similares. Es un tipo de dato
definido por el usuario que determina las estructuras
de datos que lo forman y las funciones asociadas con él,
es decir es un modelo con el que se construyen los
objetos.
[public][final][abstract] class nombreClase [extends
clase
base][implements interface]
{ lista de atributos y métodos }
- Public: Clase publica que puede ser usada
por cualquier otra clase de otro paquete. - Final: Clase que no puede tener clases
derivadas. - Abstract: Clase que no puede ser
instanciada, si derivada. - Extends: Indica de que clase hereda la
nuestra (en herencia) - Implements: Implementa interfaces (en
herencia)
- Mensaje: Es una petición de un objeto a
otro para que este se comporte de una determinada manera,
ejecutando uno de sus métodos.
Características fundamentales de la
POO:
- Encapsulamiento: Es la ocultación de
información. Significa mantener la
información dentro del objeto y mantenerlo como una caja
negra. Puede ser accedida por métodos. - Abstracción: Es la capacidad de aislar y
encapsular la información del diseño y la ejecución. Es la
capacidad para identificar atributos y métodos.Los miembros de la clase base deben ser protected o
private protected.La clase derivada hereda todos los datos y funciones
miembro, pero solo puede acceder a los miembros que le sean
permitidos desde la clase base. Puede añadir a los
miembros heredados, sus propios atributos y métodos.
Para acceder a los métodos de la clase base se usa
super().La ventaja de la herencia es que permite la
reutilización de código, ahorrando tiempo y
dinero. - Herencia: Es la propiedad
que permite a los objetos crearse a partir de otros objetos.
Cada subclase comparte características comunes con la
clase de la que deriva. La clase original la llamamos clase
base y las nuevas clases creadas a partir de ella clases
derivadas. Una clase derivada puede ser también
clase base dando lugar a una jerarquía de
clases. - Polimorfismo: Es la capacidad de que
diferentes objetos reaccionen de distinta forma a un mismo
mensaje. Es la capacidad de referirse a objetos de clases
distintas en una jerarquía utilizando el mismo elemento
de programa
(método)
para realizar la misma operación, pero de manera
diferente.
Características Secundarias de la
POO:
- Tipificación: Permite la
agrupación de objetos en tipos. - Concurrencia: Los objetos pueden actuar al
mismo tiempo. - Persistencia: Un objeto puede seguir
existiendo tras desaparecer su antecesor.
Ventajas de la POO:
- Modelos
- Modularidad
- Extensibilidad
- Eliminación de redundancias
- Reutilización: ahorro de
trabajo
Desventajas de la POO:
- Exige conocer bien la teoría de objetos.
II. Requiere mayor capacidad de los
programadores.
- r.
Acceso a los
miembros de una clase:
Private: Los miembros private son solo accesibles
por la propia clase.
Public: Son accesibles por cualquier
clase.
Protected: Son accesibles por la propia clase,
clases derivadas y clases del mismo paquete.
Private protected: Son accesibles por la propia
clase y clases derivadas.
Friendly (por defecto): Son accesibles por la
propia clase y clases del mismo paquete.
Atributos Estáticos: Son los
atributos de clase. Existe solo una instancia de ese miembro. Se
diferencian de los atributos de instancias en que mantienen un
valor por
clase. A un dato static se le asigna una zona fija de almacenamiento en
tiempo de compilación.
[modificador de
acceso][static][final][transient][volatile] Tipo nombre [=
valor]
- Static: Define un atributo de clase, unico
para todos los objetos de ella. - Final: Define una constante.
- Transient: Variables
que no forman parte del estado permanente del
objeto. - Volatile: Fuerza a
la lectura
de la variable cada vez que se le va a usar.
- Métodos sobrecargados: Métodos
de una clase que tienen mismo nombre pero difieren en numero
y/o tipos de parámetros. - Redefinición de métodos: Implica
definir un metodo en la clase derivada con el mismo nombre y
firma que el metodo en la clase base. Permite la
refinación de métodos o modificación de
los mismos en clases derivadas.
Se diferencia de la sobrecarga en que se aplica en una
jerarquía de clases y con firmas iguales, mientras que
la sobrecarga se aplica en el ámbito de una clase y con
firmas diferentes.
[modificador de
acceso][static][abstract][final][native][synchronized]
TipoDevuelto NombreMetodo [throws excepcion]
- Static: Método de clase, compartido
por todas las instancias. - Final: No puede ser redefinido.
- Native: Métodos que se implementan en
otro lenguaje
(c o C++). - Synchronized: métodos sincronizados,
se usan en concurrencia. - Throws: Indica que el método genera
determinadas excepciones.
- Constructores: Sirven para construir o
inicializar objetos.
- Tienen el mismo nombre que la clase.
- No devuelven valores.
- Pueden admitir parámetros.
- Sino se define uno el compilador genera uno por
defecto. - Se llaman en el momento de la creación del
objeto. - No se hereda.
Orden de construcción de los constructores cuando se
hereda:
- Constructores de la clase base.
- Constructores de los miembros de la clase
derivada. - Ejecución de las instrucciones contenidas en
el cuerpo del constructor de la clase derivada.
Polimorfismo: (ver
definición)
Métodos y Clases abstractas: Los
métodos abstractos son declarados pero no implementados.
Si existe un método abstracto entonces debemos declarar la
clase como abstracta, y al declararla como tal no se pueden crear
instancias de ella. Sirven para definir conceptos incompletos,
que deben ser completados en las subclases de la clase
abstracta.
Interfaces: Son clases que no tienen
implementación.
- Sirven como tipos de otras clases.
- Todos sus métodos son abstractos y
todos sus atributos son final. - Una clase puede implementar muchas
interfaces.
Implementación de Polimorfismo: El
polimorfismo se implementa por medio de las funciones abstractas,
en las clases derivadas se declara y se define una funcion que
tiene el mismo nombre, el mismo numero de parámetros y del
mismo tipo que en la clase base, pero que da lugar a un
comportamiento distinto, especifico de los objetos de la clase
derivada.
No se pueden crear objetos de una clase abstracta pero
si se pueden declarar referencias en las que guardamos el valor
devuelto por new al crear objetos de las clases
derivadas.
Manejo básico de Error y
Excepción: Cuando ciertos procedimientos,
sobretodo de entrada y salida encuentran errores, se produce la
inconsistencia o terminación de un programa.
En C++ y java se pueden controlar y capturar esos
errores:
- División por cero
- Desborde de índices en arreglos
- Archivo no existente
- Parámetros no esperados
- Errores de entrada y salida
Excepciones: Porciones de códigos
robustos, que si se produce un error, disparan o ejecutan
algún código de corrección o de
información.
Try……Catch : Controla y captura un bloque de
código.
Applets: Los applets son programas que se
ejecutan en el navegador. Son aplicaciones accesibles en un
servidor
web, que se
transportan por la red.
Clase JApplet: clase de java que permite
extenderse para crear applets.
Ciclo de vida de un applet: Un applet se carga,
se instancia y ejecuta dentro de un navegador web.
- init() : Lo invoca el navegador cuando se
carga el applet. // se usa como un constructor // - start() : Se llama después del init() y
cada vez que el applet vuelve al area visible del
navegador. - stop() : Se llama cuando se sale del
área visible del navegador, y también antes del
destroy(). Detiene la ejecución pero no lo saca de
memoria. - destroy() : Se llama cuando se descarga el
applet del navegador. Lo saca de memoria.
Todos los applets que hacen algo después de la
inicialización (excepto la respuesta a una acción al usuario) deben sobrescribir el
método start().
Componentes: Son elementos (objetos) que
pueden formar parte de una interfaz grafica.
Componentes básicos:
- Etiquetas (jlabel): Son usadas generalmente
para mostrar texto no
modificable. - Campos de edición (jtextfield): campos de texto
modificable. - Botones (jbutton): Para recibir comandos dados
por el usuario atraves del raton - Casillas de verificación (jcheck
box) - Listas desplegables (jcombo box)
- Listas (jlist)
Métodos básicos:
- Setsize(int, int): Define el
tamaño - Setlocation(int, int): Define la
ubicacion - Setbounds(int, int, int, int) : Define al
mismo tiempo las dos anteriores.
Contenedores: Son componentes que pueden
alojar a otros componentes.
Contenedores básicos:
- Panel (JPanel): Es el mas usado. Para acceder
a este panel se usa la funcion getcontentpane(). - Panel desplazable (JscrollPanel)
- Ventanas (Jframe)
- Ventanas de dialogo
(Jdialog) - Diálogos de opción
(JoptionPane)
Manejo de Eventos: Es el proceso de
respuesta a los eventos que son
generados por el usuario (presionar un botón del mouse,
seleccionar una opción del menú, ingresar un texto,
etc).
Java usa un modelo de delegación de eventos
basado en un escucha, se genera una relación de
dependencia entre los objetos, de manera que cuando un objeto
cambia de estado todos sus dependientes son notificados y
actúan automáticamente.
Escuchas (Listeners): Son interfaces (deben
redefinirse todos los métodos de la clase implementada) de
java que definen el protocolo de
llamada a los distintos eventos. Para evitarnos de dar
implementaciones vacías a los métodos declarados en
la interfaz del escucha que no nos interesan usamos
adaptadores.
Adaptadores: Implementan versiones vacias para
todos los metodos del interfaz.
Tipos de eventos:
- De ratón (MouseEvent): La clase
MouseAdapter implementa al interfase MouseListener que tiene
varios metodos como mouseClicked, mouseEntered,
etc. - De teclado
(KeyEvent) - De ventana (WindowsEvent)
- De accion (ActionEvent): ¿Qué
pasaria si apretáramos la barra espaciadora? No pasa
nada porque no implementamos ningun escucha para eventos de
teclado. Un evento de accion es un evento de alto nivel que es
disparado por un componentecuando se realiza la accion
principal.
No tiene una clase adaptador porque solo posee un
unico metodo: actionPeroformed.
Aquí es muy util el metodo getsource() que nos
devuelve el objeto que genero el
evento.
Concurrencia: Programas que pueden correr
al mismo tiempo compartiendo recursos y
datos.
En un programa concurrente dos o mas procesos
pueden comenzar a ejecutarse al mismo tiempo, pero si en un dado
momento requieren simultáneamente u recurso unico,
concurren por él. Los programas corren en
paralelo.
Los hilos o procesos ligeros son una parte
de código o miniprograma que puede ser ejecutada
independientemente, de forma que una aplicación o un
applet puede tener varios hilos ejecutándose
simultáneamente y efectuando distintas tareas; estos hilos
se encuentran dentro de un programa y son parte de
él.
Los hilos, a veces también llamados
contextos de ejecución, pueden ser utilizados para
la implementación de algoritmos
paralelos o procesos concurrentes, sin ser necesario disponer de
equipos con estructura de
multiprocesador. En el caso de un solo procesador, los
procesos ligeros incorporan mecanismos para compartirlo,
estableciéndose prioridades
entre ellos y también facilidades de
sincronización, cuando es necesario.
Multiproceso se refiere a dos programas que se
ejecutan "aparentemente" a la vez, bajo el control del
sistema
operativo.
Multihilo se refiere a que dos o mas tareas se
ejecutan "aparentemente" a la vez, dentro de un mismo
programa.
Los procesos se ejecutan en realidad "concurrentemente",
dado que comparten la cpu.
Cada hilo, después de su creación y
antes de su destrucción, estará en uno de cuatro
estados: recien creada, "corrible", bloqueada, o
muerta.
Para ver el gráfico seleccione
la opción "Descargar" del menú
superior
Recién creada (New thread):
entra aquí inmediatamente despues de su creación.
Es decir luego del llamado a new. En este estado los datos
locales son ubicados e iniciados. Luego de la invocación
a start(), el hilo pasa al estado "corrible".
Corrible (Runnable): Aquí el
contexto de ejecución existe y el hilo puede ocupar la
CPU en cualquier momento. Este estado puede subdividirse en
dos: Corriendo y encolado. La transición entre estos dos
estados es manejado por lel itinerador de la máquina
virtual.
Nota: Un hilo que invoca al método () voluntariamente se
mueve asimisma al estado encolado desde el estado
corriendo.
Bloqueada (not Runnable): Se ingresa cuando: se
invoca suspend(), el hilo invoca el método wait() de
algún objeto, el hilo invoca sleep(), el hilo espera por
alguna operación de I/O, o el hilo invoca join() de otro
hilo para espera por su término. El hilo vuelve al
estado Corrible cuando el evento por que espera
ocurre.
Muerta (Dead): Se llega a este estado
cuando el hilo termia su ejecución (concluye el
método run) o es detenida por otro hilo llamando al su
método stop(). Esta última acción no es
recomendada.
Planificación de hilos: Para solucionar el
problema de comparticion de recursos se puede asignar distintas
prioridades a los hilos. Se puede modificar la prioridad de un
hilo en cualquier momento después de su creación
usando el metodo: setPriority() getPriority().
La prioridad de un hilo tiene el efecto
de:
- Si hay 2 hilos para ejecutarse, se ejecuta primero el
de mayor prioridad. - Si hay 1 hilo ejecutándose y entra un hilo de
mayor prioridad, el primer hilo sale de ejecución y
entra este ultimo.
Hilos demonio: Son hilos de muy baja prioridad
(llamados servicios) que
normalmente se ejecutan en periodos muy largos usando pocos
recurso. Para crear un demonio se usa setDaemon():true o
false.
Clase Thread: Maneja hilos de ejecución.
Hay metodos que controlan si el hilo esta ejecutado, durmiendo,
en suspenso o detenido.
Metodos básicos:
- sleep(milis): Pone en suspenso un hilo en
ejecución durante un cierto tiempo. - start(): Pone a ejecutar un hilo. Crea un hilo
de sistema y
ejecuta. Luego llama al metodo run(). - run(): Lleva el cuerpo del hilo. Es llamado
por el metodo start(). Normalmente es un bucle. Hay que
redefinirlo. - suspend(): Detiene el hilo, pero no lo
destruye. Puede ejecutarse de nuevo. Met.de
instancia. - resume(): Reanuda el hilo de ejecución
detenido. Met.de instancia. - interrupt(): Detiene el hilo de
ejecución, normalmente no se usa, se deja que el hilo
termine su correcta ejecución. - join(): Fuerza al hilo a esperar la
finalizacion de los hilos asociados.
Sincronización: Cuando dos hilos
necesitan usar el mismo objeto aparecen las operaciones
entrelazadas que pueden corromper (dañar) los
datos.
La solucion es sincronizar el acceso a esa region.
Cuando hay multiples hilos que pueden acceder a una misma region
se utiliza el "bloqueo" de la misma, que consiste en darle el
acceso y control total solo a un hilo.
El bloqueo comienza cuando se ejecuta el metodo
(synchronized) y finaliza cuando termina el metodo ya sea por
return o por una terminación anormal
(excepciones).
Comunicación entre hilos: Aparte de
la sincronizacion, se usa la
comunicación entre hilos para solucionar los problemas de
comparticion de datos.
Los hilos se notifican entre si la finalizacion o
comienzo de las acciones.
- Metodos utilizados para la comunicación:
- Wait(): Deja al hilo esperando hasta que
ocurra alguna condicion. Hasta que otro hilo le notifique
que ocurrio algo. - Notify(): Notifica al hilo que espera que
hay algun cambio
que podria satisfacer esa condicion. - Notifyall(): Notifica a todos los hilos en
espera (wait).
- Wait(): Deja al hilo esperando hasta que
Modelo productor – consumidor:
Un hilo produce una salida que otro hilo usa o
consume.
En la programación secuencial no hay problema ya
que si el productor se ejecuta primero, luego el consumidor tiene
lo que el productor le envia.
En la programación concurrente si hay problema ya
que los dos corren al mismo tiempo ¿cuál es el que
corre primero?¿el productor o el consumidor?
Si el productor corre mas rápido que el
consumidor se pueden perder datos, ya que el consumidor no los
puede tomar a la misma velocidad.
Si el consumidor es mas rápido querrá
tomar los datos que el productor todavía no ha
producido.
La solución a este problema es contar con una
clase que controle y supervise y sincronice al productor y
consumidor, esta clase la denominaremos "monitor".
- Que el metodo run() retorne normalmente
- Que el metodo run() finalice bruscamente
- Que el metodo destroy() se invoque.
- Que el programa termine normalmente.
Prolog
Lenguaje de primer orden (logica proposicional):
es la que usa proposiciones y nexos entre estas para expresar
verdades.
Símbolos del predicado: Los símbolos del predicado son usados para
denotar alguna propiedad de objetos o alguna relacion entre
objetos.
Enunciado atomico: Se forman colocando un
predicado de aridad N al frente de N
nombres.
Ej.: Mayor(juan, ana)
Enunciado atomicos combinados: Ej.: vuela(paloma)
v ponehuevo(paloma)
Reglas: Llamadas Clausula de Horn (son
predicados bien formados que se encuentran en forma
clausal).
Estan compuestos por dos partes: el consecuente y el
antecedente.
El consecuente es la primera parte de la clausula, "es
lo que se quiere probar", la conclusión de la
regla.
El antecedente es la "condicion", que determinara en que
casos el consecuente es verdadero o falso.
Conclusión si condicion
Consecuente si antecedente
Prolog: Se divide en 4
secciones.
- domains: Aquí se definen los objetos y
tipos de datos
(symbol, char, integer, real, string). Ej.: domains
Objeto = tipo de dato
- Predicates: Aquí se definen como seran
las relaciones entre los objetos del dominio y el
valor que se le asignara en las clausulas. Ej.:
sabe(nombre) - Goal: Aquí se indica cual es el
objetivo o
propósito del programa.
- Interno: Se especifica en la "seccion goal"
un hecho a verificar. El mecanismo de búsqueda se
detiene al encontrar el primer valor que cumpla. Responde
true o false, no muestra
mensajes. - Externo: se trabaja en la "ventana de
dialogo", verificando y consultando hechos en forma
interactiva. Entrega todos los
valores que lo verifiquen. La búsqueda se detiene
al agotarse las clausulas. Puede mostrar
mensajes.
- Clauses: Aquí se definen las "reglas"
y "hechos" que se evaluaran para encontrar soluciones
que se pidan en la seccion goal o por la ventana de
dialogo.
Objetos compuestos: Hay veces que necesitamos
poner mas detalles. Recurrimos a los "Functores".
Listas: Es un conjunto de elementos encerrados
entre corchetes y separados por comas.
[H|C] la cabeza puede usarce para extraer componentes de
una lista.
Backtracking: Es una técnica de borrado
que consiste en reemplazar cada submeta por los consecuentes de
todas las reglas que la satisfagan. Es un mecanismo de
búsqueda de datos. Consiste en recorrer reiteradamente las
clausulas, tratando de establecer si el objetivo actual puede
considerarse como verdadero o false. (ver todo el proceso en el
libro para
entenderlo mejor)
Fernando "Tena" Paez