Programa: Los programas se organizan como colecciones de objetos que colaboran entre si enviándose mensajes.
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.
[public][final][abstract] class nombreClase [extends clase base][implements interface]
{ lista de atributos y métodos }
Características fundamentales de la POO:
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.
Características Secundarias de la POO:
Ventajas de la POO:
Desventajas de la POO:
II. Requiere mayor capacidad de los programadores.
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]
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]
Orden de construcción de los constructores cuando se hereda:
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.
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:
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.
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:
Métodos básicos:
Contenedores: Son componentes que pueden alojar a otros componentes.
Contenedores básicos:
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:
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:
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:
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.
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".
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.
Ej.: domains
Objeto = tipo de dato
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
Trabajos relacionados
Ver mas trabajos de Programacion |
|
Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo en formato DOC desde el menú superior.