- 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).
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