PROGRAMACION 3
PARADIGMA: Forma de entender y representar la realidad
● Paradigma funcional.
● Paradigma lógico.
● Paradigma imperativo.
● Paradigma orientado a objetos: Metodología de desarrollo de aplicaciones en la cual
éstas se organizan
como colecciones de cooperativas de objetos, cada uno de los cuales representan
una instancia de alguna clase.
CARACTERISTICAS DE JAVA:
● Independiente de la plataforma: No tiene alguna relación con un id ni un SO gracias a la
máquina virtual, el código se puede transportar.
● Orientado a objetos: Java está programado ya con los fundamentos de la POO.
● Es claro, es simple, sin sobrecarga de operadores ni punteros: Esto hace que sea más
simple la codificación del lenguaje
● Robusto. Detección temprana de errores: Detección de errores a medida que se va
realizando el código sin necesidad de que el programa este en ejecución.
● Seguro: Tiene mecanismos de seguridad a la hora de encriptar el código.
● Sistemas distribuidos: Un sistema puede ser utilizado por varios usuarios.
● Multihilo: Múltiples ejecuciones del programa.
OBJETIVO DE LA POO:
● Cohesión: Todos los elementos dentro de un método/clase están estrechamente
relacionados.
● Acoplamiento: Cuando un componente tiene bajo nivel de acoplamiento quiere decir que el
nivel de dependencia que tiene un componente con respecto a los otros es bajo.
4 conceptos clave:
● Abstracción: Consiste en aislar un elemento de su contexto. Se enfoca en la visión externa
de un objeto. Quitar las propiedades y acciones de un objeto para dejar solo aquellas que
sean necesarias.
● Encapsulamiento: Ocultamiento de los datos de un objeto de manera que solo se pueda
cambiar mediante las operaciones definidas por ese objeto.
● Herencia: Permite compartir automáticamente métodos y datos entre clases, subclases y
objetos.
● Polimorfismo: Es la capacidad que tienen los objetos de una clase en ofrecer respuesta
distinta e independiente en función de los parámetros utilizados durante su invocación.
Dicho de otro modo, el objeto como entidad puede contener valores de diferentes tipos
durante la ejecución del programa.
OBJETO: Es una entidad autónoma que contiene atributos y comportamiento.
● Se combinan datos y la lógica de programación.
● Tienen estado y comportamiento.
Relación entre objetos:
● Asociación: Se podría definir como el momento en que dos objetos se unen para
trabajar juntos y así alcanzar una meta.
● Agregación/composición: Es un tipo de relación dependiente en donde un objeto
más complejo es conformado por objetos más simples.
● Herencia: Facilita la creación de objetos a partir de otros ya existentes e implica que
una subclase obtiene los métodos y atributos de una superclase.
● Modularidad: Subdividir una aplicación en partes más pequeñas y que cada una sea
independiente y haga una tarea específica.
CLASES: Es una plantilla para la creación de objetos.
● Cada clase es un modelo que define un conjunto de variables y métodos
CLASES FINALES: Si queremos que una clase NO sea heredada por otra, deberá ser declarada final.
INSTANCIA: Cada objeto creado a partir de una clase.
COMUNICACIÓN ENTRE OBJETOS: Comunicación entre objetos a través de métodos.
MÉTODOS: Definen el comportamiento de los objetos de una clase. Pueden realizar cualquier operación con la
información del objeto. Al igual que en los atributos, estos pueden ser Private o Public.
ATRIBUTO: Contenedor de un tipo de dato asociado a un objeto, que hace los datos visibles o no, a través del
modificador de acceso, desde fuera del objeto.
MODIFICADORES DE ACCESO:
● Public: Ofrece la máxima visibilidad. Una variable, el método o clase será visible
desde cualquier clase.
● Private: Cuando un método o un atributo es declarado como private, su uso queda
restringido al interior de la misma clase.
● Protected: Un método o atributo es declarado como protected es visible para las
clases del mismo paquete y subclases.
● (default): Visibilidad para clases del mismo paquete.
CONSTRUCTORES: Es una función o método que se llama automáticamente al crear un objeto de una
clase. Se permiten varios constructores, cada uno con parámetros de entrada diferentes. Se llaman igual
que la clase. Son siempre públicos. El constructor de una clase hija puede llamar al constructor de su clase
padre mediante el operador Super.
VARIABLES: Una variable es un identificador que representa una palabra de memoria que contiene
información.
CLASIFICACIÓN:
● Variables de instancia: Los valores que pueden tomar son únicos para cada instancia.
● Variables de clase: Se declaran con el modificador static para indicarle al compilador que
hay exactamente una copia de la variable, y que es compartida por todas las instancias.
● Variables locales: La determinación viene desde la ubicación en donde la variable fue
creada, es decir, local al modo. Solo es visible al método donde fue declarada y no puede se
accedida desde el resto de las clases.
Tipos primitivos de variables:
Son el tipo más simple de la programación orientada a objetos, En java ya están predefinidos y los nombres
de los tipos describen el valor que pueden almacenar.
Int – Char – Short – Byte – Boolean – Float – Bouble – Long
JAVA VIRTUAL MACHINE (JVM): Máquina virtual capaz de interpretar y ejecutar instrucciones expresadas
en un código binario espacial, el cual es generado por el compilador del lenguaje java.
SECCIONES:
● Zona de datos: Donde se almacenan las instrucciones del programa, las clases con sus
métodos y constantes. No se pueden modificar en el tiempo de ejecución.
● Stack: El tamaño se define en tiempo de compilación y es estático en tiempo de ejecución.
Aquí se almacenan las instancias de los objetos y los datos primitivos.
● Heap: Zona de memoria dinámica. Almacena los objetos que se crean.
TAREAS PRINCIPALES:
● Reservar espacio de memoria para los objetos creados.
● Liberar la memoria no usada.
● Asignar variables a registros y pilas.
● Llamar al sistema huésped para ciertas funciones, como los accesos a los dispositivos.
● Vigilar el cumplimiento de las normas de seguridad de las aplicaciones java.
GARBAJE COLECTOR:
● Es un proceso de baja prioridad que se ejecuta dentro de la JVM.
● Técnica por la cual el ambiente de objetos se encarga de destruir y asignar
automáticamente la memoria heap.
● El programador no debe preocuparse por la asignación y liberación de memoria, ya
que el entorno la asignará al crear un nuevo objeto y la liberará cuando nadie la esté
usando.
● Un objeto podrá ser “limpiado” cuando desde el stack ninguna variable haga
referencia al mismo.
CLASES WRAPPER: Los Wrappers java (envoltorios) son clases diseñadas para ser un complemento
de los tipos primitivos siendo los únicos elementos de Java que no son objetos
CLASE STRING: Serie de caracteres tratados como si fuesen una única entidad. Las variables de tipo String
son objetos, por lo que se puede acceder a sus métodos.
StringBuilder: Para no crear/destruir instancias de objetos del tipo String cada vez que
queremos modificar. A diferencia de los strings, estos se pueden modificar sin estar creando
nuevas instancias de memoria.
CLASE OBJET: Es la clase raíz de todo el árbol de la jerarquía, y proporciona un cierto número de métodos
de utilidad general que pueden utilizar todos los objetos. Es un método por el que un objeto se puede
comparar con otro, también convierte un objeto en una cadena.
METODO EQUALS: Se utiliza para comparar dos objetos. Se utiliza para saber si dos objetos separados son
del mismo tipo y contienen los mismos datos. El método devuelve true si los objetos son iguales y false en
caso contrario. Las subclases pueden sobreescribir el método equals para realizar la adecuada
comparación entre dos objetos de un tipo que haya sido definido por el programador.
STATIC Y NON-STATIC: Son métodos que no usan valores variables de instancia. No es necesario crear una
instancia de la clase.
● Método regular: Un método declarado con la palabra reservada static nos indica que se
puede invocarlo sin necesidad de crear una instancia de clase.
Se pueden combinar métodos regulares y estáticos en la misma clase.
Los métodos estáticos no pueden usar variables de instancia.
Los métodos estáticos no pueden usar métodos regulares, porque usan variables de
instancia.
● Variables estáticas: Una variable compartida por todos los métodos de una clase.
● Constantes: La palabra reservada final indica que una vez inicializada, el valor de la variable
no puede cambiar.
Generalmente se establece como public para que puedan ser accedidas desde cualquier
lugar de nuestro código.
Son estáticas para que no sea necesario crear una instancia de la clase para poder usarlas.
EL NOMBRE DE UNA CONSTANTE DEBE ESTAR EN MAYUSCULA.
● Final: Una variable final significa que su valor no puede cambiar, un método final significa
que no puede sobrescribirse y una clase final significa que no puede tener subclases.
HERENCIA: La herencia es un mecanismo que permite la definición de una clase a partir de la definición de
otra ya existente.
Permite compartir automáticamente métodos y características entre clases.
Las clases hijas también pueden sobrescribir los métodos que heredan.
El concepto de herencia conduce a una estructura jerárquica de clases o estructura de árbol.
Estructura jerárquica: SUPERCLASE – SUBCLASE.
Ventajas:
● Evitar duplicidad y favorecer la Reutilización de código.
● Facilitar el Mantenimiento de las aplicaciones que diseñamos.
● Facilitar la Extensión de las aplicaciones que diseñamos.
ABSTRACT: Una clase de la que no se tiene intención de crear objetos, sino que únicamente sirve para
unificar datos u operaciones de subclases, puede declararse como una clase abstracta.
Son útiles para realizar implementaciones parciales, es decir, realizan partes de sus funcionalidades
postergando el resto a sus subclases.
Clase abstracta: La clase abstracta posee atributos y métodos, pero tiene una condición: Al menos uno de
sus métodos debe ser abstracto (no siempre). Además, no se puede instanciar.
Un método abstracto se caracteriza por dos cosas:
● Está precedido por la palabra Abstract.
● No tiene cuerpo y su encabezado termina con punto y coma.
SI UN METODO SE DECLARA COMO ABSTRACTO, LA CLASE DEBE SER DECLARADA COMO ABSTRACTA
Los métodos abstractos, deben implementarse en las subclases. Si estos no se implementan, la subclase
también debe ser definida como abstracta.
Palabra reservada super: Se utiliza para invocar métodos de la superclase. Si el constructor en la subclase
no invoca explícitamente al constructor de la superclase, el compilador de java lo inserta
automáticamente.
Protected: El modificador de acceso protected indica que la variable de instancia puede ser leída desde las
subclases.
Ejecución dinámica de métodos: Los métodos sobrescritos de las subclases tienen precedencia sobre los
métodos de las subclases.
La búsqueda del método comienza al final de la jerarquía, entonces la última redefinición de un método es
la que se ejecuta primero. (El camino de migas By BENOFFI).
POLIMORFISMO: Se refiere a la propiedad por la que es posible enviar mensajes sintácticamente iguales a
objetos de distintos tipos.
IMPORTANTE: Siempre que declaremos un objeto de un tipo elemento, aunque instanciemos de otra
clase, los métodos que se enlistan en tiempo de compilación son del tipo elemento. Pero si lo ejecutamos,
se ejecutan los métodos de la clase instanciada. Esto se llama PRINCIPIO DE LIGADURA DINAMICA.
SUSTITUCION: En los lenguajes orientados a objetos podemos sustituir por un objeto de una subclase en el
lugar donde se espera un objeto de una superclase porque el objeto de la subclase es un caso especial de
la superclase.
INTERFACES: Se comportan como clases abstractas, lucen como clases abstractas, se declaran como clases
abstractas, pero son INTERFACES. Listado de métodos que las clases van a compartir.
Una interfaz es una lista de acciones que puede llevar a cabo un determinado objeto. Lo que un objeto es
capaz de hacer, tengan o no relación.
La diferencia entre las clases abstractas y la herencia es que las clases no tienen relación entre sí.
● En la interfaz solo se encuentra el prototipado.
● Es empleada para definir un comportamiento, que posteriormente será implementado por
diversas clases, que podrían o no tener nada que ver entre ellas.
● Las clases (no abstractas) que implementan una interfaz están obligadas a darle un cuerpo a
dichos métodos.
SE PUEDE IMPLEMENTAR MAS DE UNA INTERFAZ A UNA CLASE.
Todos los métodos de una interfaz son públicos.
Las interfaces no se pueden instanciar.
PROGRAMACION PARTE 2
Collection:
● Es una interfaz, no se puede construir, sino que proporciona métodos para las listas que
implementen esta interfaz
● En algunas implementaciones, el orden no es importante.
● Puede haber duplicados.
● Bajo rendimiento.
● Provee métodos de estáticos (de clase) o de instancia para búsqueda, ordenamiento,
agregación, iteración, eliminado, entre otras.
Métodos de instancia más usados:
ACLARACION: que los métodos sean de instancia significa que necesito una colección para
poder implementarlos.
● Void add (Objeto obj)
● Void addAll (Collection c)
● Int size ()
● Boolean contains (Object obj)
● Void clear ()
● Boolean remove (Object obj)
Métodos estáticos más usados:
● Boolean addAll(Collection c, T… elements)
o [Link](elementos, new CD(), new DVD());
● Void copy (List listaDestino, List listaOrigen)
● int frequency (Collection c, Object obj) *obj debe implementar equals()
● Object max (Collection c) * Los elementos tienen que implementar comparable
● Object min (Collection c) *los elementos tienen que implementar comparable
● Void reverse (List lista)
ArrayList
Hemos de destacar que la implementación de ArrayLIst no está sincronizada, es decir, si múltiples
hilos acceden a un mismo ArrayLIst concurrentemente podríamos tener problemas en la consistencia de
los datos. Por lo tanto, debemos tener en cuenta cuando usemos este tipo de datos que debemos
controlar la concurrencia del acceso.
Vector
Es una implementación similar al ArrayLIst, con la diferencia de que el Vector si está sincronizado.
Este es un caso especial, ya que la implementación básica del resto de tipos de datos no está sincronizada.
Métodos del vector:
● Void addElement (Object obj)
● Object elementAt (int índice)
● Void insertElementAt (Object obj, int índice)
● Boolean removeElement (object obj)
● Void removeElementAt (int índice)
● Void setElementAt (object obj, int índice)
● Int size()
LinkedList
Se implementa la lista mediante una lista doblemente enlazada. Por lo tanto, el coste temporal de
las operaciones será el de este tipo de listas. Cuando realicemos inserciones, borrados o lecturas en los
extremos inicial o final de la lista, el tiempo será constante, mientras que para cualquier operación en la
que necesitemos localizar un determinado índice dentro de la lista deberemos recorrer la lista de inicio a
fin, por lo que el coste será lineal con el tamaño de la lista O(n)(big O), siendo n el tamaño de la lista.
Métodos de la LinkedList:
● Void addFirst(Object obj) / void addLast(Object obj)
● Object getFirst() / Object getLast()
● Object removeFirst() / Object removeLast()
Conjuntos
Los conjuntos con grupos de elementos en los que no encontramos ningún elemento repetido.
Para ello es necesario implementar el método equals.
La interfaz set no permite duplicados
La interfaz SET, al igual que list, nos proporciona una serie de métodos:
● Añadir un elemento a la colección
● Eliminar un elemento de la colección
● Obtener un elemento de la colección
● Localizar un elemento en la colección
● Iterar sobre la colección
Iterator: Método que recorre los elementos de una colección.
Ejemplo:
Iterator it = [Link] ();
While([Link]()){
[Link]([Link]());
}
HashSet
Los objetos se almacenan en una tabla de dispersión (hash). El coste de las operaciones básicas
(inserción, borrado, búsqueda) se realizan en tiempo constante siempre que los elementos se hayan
dispersado de forma adecuada.
La iteración a través de sus elementos en más costosa, ya que necesitará recorrer todas las entradas de la
tabla de dispersión, lo que hará que el coste esté en función tanto del número de elementos insertados en
el conjunto, como del número de entradas de la tabla. El orden de iteración puede diferir del orden en el
que se insertaron los elementos.
LinkedHashSet
Es similar a la anterior pero la tabla de dispersión es doblemente enlazada. Los elementos que se
inserten tendrán enlaces entre ellos. Por lo tanto, las operaciones básicas seguirán teniendo coste
constante, con la carga adicional que supone tener que gestionar los enlaces. Sin embargo, habrá una
mejora en la iteración, ya que, al establecerse enlaces entre los elementos, no tendremos que recorrer
todas las entradas de la tabla, el coste sólo estará en función del número de elementos insertados. En este
caso, al haber enlaces entre los elementos, estos enlaces definirán el orden en el que se insertaron en el
conjunto, por lo que el orden de iteración será el mismo orden en el que se insertaron.
TreeSet
Utiliza un árbol para el almacenamiento de los elementos. Por lo tanto, el coste para realizar las
operaciones básicas será logarítmico con el número de elementos que tenga el conjunto O(log n).
Métodos del treeSet:
● Object higher (object o): Devuelve el elemento menor de la colección, pero que sea
mayor que el elemento dado. Devuelve null si no existe elemento dado.
Ejemplo: [Link] (new integre(5)); // 6 {1-10}
● Object lower (object o): Devuelve el elemento mayor de la oleccion, pero que sea
menor que el elemento dado. Devuelve null si no existe elemento dado.
Ejemplo: [Link] (new integer(5)); // 4 {1-10}
● Object pollFirst(): Elimina el primer elemento de la colección. Devuelve null si está
vacía.
● Object pollLast(): Elimina el último elemento de la colección. Devuelve null si está
vacía
Mapas
Aunque muchas veces se hable de los mapas como una colección, en realidad no lo son, ya que no
heredan de la interfaz Collection.
Los mapas se definen en la interfaz Map. Un mapa es un objeto que relaciona una clave (key) con
un valor. Contendrá un conjunto de claves, y cada clave se le asociará un determinado valor. En versiones
anteriores este mapeado entre claves y valores lo hacía la clase Dictionary, que ha quedado obsoleta.
Tanto la clave como el valor puede ser cualquier objeto.
Métodos de los mapas:
● Object get (Object clave)
● Object put (Object clave, Object valor)
● Object remove (Object clave)
● Set keySet()
● Int size()
Como recorrer un mapa:
Iterator it = [Link]().iterator();
StringBuilder sb = new StringBuilder();
While ([Link]()){
[Link] me = ([Link]) [Link]();
[Link]([Link]()+”-“+[Link]());
}
HashMap
Los elementos que se insertan en un HashMap no tendrán un orden especifico.
Utiliza una tabla de dispersión para almacenar la información del mapa. Las operaciones básicas (get y put)
se harán en tiempo constante siempre que se dispersen adecuadamente los elementos. Es coste de la
iteración dependerá del número de entradas de la tabla y del número de elementos del mapa. No se
garantiza que se respete el orden de las claves.
Hashtable
Es una implementación similar a HashMap, pero con alguna diferencia. Mientras las anteriores
implementaciones no están sincronizadas, esta sí que lo está. Además, en esta implementación, al
contrario que las anteriores, no se permitirán claves nulas (null). Este objeto extiende la obsoleta clase
Dictionary, ya que viene de versiones más antiguas de JDK.
TreeMap
Utiliza un árbol simétrico y equilibrado para implementar el mapa. El coste de las operaciones
básicas será logarítmico con el número de elementos del mapa O(log n). En este caso los elementos se
encontrarán ordenados por orden ascendente de clave.
Queue
Representa al tipo Cola, que es una lista en la que sus elementos se introducen únicamente por un
extremo (fin de la cola) y se remueven por el extremo contrario (principio de la cola).
GENERICIDAD
El término genericidad se refiere a una serie de técnicas que permiten escribir algoritmos o definir
contenedores de forma que puedan aplicarse a un amplio rango de tipos de datos
● Haciendo abstracción del tipo de datos que contienen o al que son aplicados.
● Parametrizando el tipo o tipos de datos que intervienen.
La genericidad es una propiedad que permite definir una clase o un método sin especificar el tipo de datos
o parámetros de uno o más de sus miembros; De esta forma se puede cambiar la clase para adaptarla a
diferentes usos sin tener que reescribirla; La genericidad es beneficiosa, ya que permite escribir un código
más seguro y fácil de leer.
La razón de la genericidad se basa principalmente en el hecho de que los algoritmos de resolución de
numerosos problemas no dependen del tipo de datos que procesa.
Casos de uso:
● Operaciones aplicables a cualquier dato, independientemente de su tipo.
● Contenedores cuyas operaciones no dependen del tipo de datos almacenado.
● Acceso uniforme a contenedores secuenciales.
● Algoritmos y contenedores aplicables a tipos de datos para los que esté definida una
determinada operación
Restricciones con tipos genéricos
● No se puede instanciar una clase genérica con tipos de datos primitivos.
● No se pueden crear objetos ni arreglos del tipo genérico. Ej: T dato = new T(); Aunque esto
no impide declarar variables o argumentos genéricos.
Métodos genéricos
● Un método genérico o plantilla se utiliza para definir un grupo de métodos que se pueden
utilizar para tipos diferentes.
● Especifica un conjunto indeterminado de métodos con el mismo nombre que pueden
invocarse con argumentos de diferentes tipos.
● Un método genérico puede definirse dentro de una clase ordinaria o dentro de una clase
genérica
Herencia y Genericidad
● Una clase puede heredar de una clase genérica.
● La nueva clase puede
o Mantener la genericidad de la clase padre
o Restringir genericidad
o No ser genérica y especificar un tipo de dato concreto
EXCEPCIONES
Son, normalmente, condiciones de errores súbitos que suelen terminar el programa en ejecución.
El manejo de excepciones es el mecanismo previsto por Java para el tratamiento de estas equivocaciones.
Generalmente ante estos errores, el programa se cierra. Java nos permite recuperarnos, es decir, mostrar
un mensaje de error y decidir si continuamos o no.
Las excepciones se capturan (catch)
Un programa lanza (throws) una excepción en el momento que detecta el error.
● Si al ocurrir un error está activo una porción de código denominado manejador de
excepción(TryCatch), entonces el flujo de control se transfiere al manejador ; Si no existe un
manejador para la excepción, esta se propaga al método que invoca, si en este tampoco se capta, la
excepción se propaga al que a su vez le llamó; si llega al método por el que empieza la ejecución, es
decir el main, y tampoco es captada, la ejecución termina.
El manejo de errores usando excepciones no evita errores, solo permite su detección y posible
reparación
Palabras clave:
● Try: Es un bloque para detectar excepciones
● Catch: Es un manejador para capturar excepciones de los bloques try
● Throw: Es una expresión para levantar excepciones
● Throws: Indica las excepciones que puede elevar un método
● Finally: Es un bloque opcional situado después de los catch de un try