miércoles, 27 de febrero de 2019

Interfaz Gráfica de Usuario (GUI)

¿Qué es una Interfaz de Usuario?

La interfaz de usuario es el medio con que el usuario puede comunicarse con una máquina, equipo, computadora o dispositivo, y comprende todos los puntos de contacto entre el usuario y el equipo.
Normalmente suelen ser fáciles de entender y fáciles de accionar, aunque en el ámbito de la informática es preferible referirse a que suelen ser "usables", "amigables e intuitivos" porque es complejo y subjetivo decir "fácil".
La interfaz de usuario es el espacio donde se producen las interacciones entre seres humanos y máquinas. El objetivo de esta interacción es permitir el funcionamiento y control más efectivo de la máquina desde la interacción con el humano.
Las interfaces básicas de usuario son aquellas que incluyen elementos como menús, ventanas, contenido gráfico, cursor, los beeps y algunos otros sonidos que la computadora hace, y en general, todos aquellos canales por los cuales se permite la comunicación entre el ser humano y la computadora.
El objetivo del diseño de una interfaz es producir una interfaz que sea fácil de usar (explicarse por sí misma), eficiente y agradable para que al operar la máquina dé el resultado deseado.

¿Qué es una Interfaz Gráfica de Usuario?

Es un programa informático que actúa de interfaz de usuario, utilizando un conjunto de imágenes y objetos gráficos para representar la información y acciones disponibles en la interfaz. Su principal uso, consiste en proporcionar un entorno visual sencillo para permitir la comunicación con el sistema operativo de una máquina o computador.


16 Recomendaciones para crear una GUI amigable

  • Consistencia. Con una buena interfaz de usuario, se debe requerir la misma secuencia de acciones en situaciones similares. Del mismo modo, se debe usar la misma terminología en cuadros de diálogo, menús y ventanas.
  • Rapidez. Se debe procurar que usuarios frecuentes puedan usar atajos, para aumentar el ritmo de interacción. Combinaciones de teclas, accesos directos, comandos ocultos, etc., son de mucha ayuda para un usuario experto.
  • Información. Cada operación debe ir acompañada de algún tipo de feedback del sistema en forma de mensajes cortos.
  • Estética. Una interfaz atractiva hace que el uso de la interfaz sea más agradable y aumente la satisfacción del usuario final.
  • Revocación de acciones. Una buena interfaz no debe castigar al usuario por los errores que comete, sino que debe ofrecerles la posibilidad de ponerles remedio. Al permitir fácil anulación de acciones, por ejemplo mediante un botón de “deshacer”, el usuario se relaja y tiende más a explorar otras opciones del programa.
  • La regla de los dos segundos: Idealmente, el usuario no debería tener que esperar más de dos segundos para cambiar o cargar una aplicación. Si por algún motivo, este proceso va a tardar más, es conveniente incluir una pantalla previa con una barra de estado para gestionar las expectativas del usuario. En general, cuanto más rápida sea la carga, mejor será la experiencia.
  • La regla del tercer clic: El usuario debería acceder a la información que necesita en dos clics (o deslizamientos de dedo en el caso de pantallas táctiles) o tres como máximo. Si debe hacer más clics, lo más probable es que abandone la página o aplicación.
  • La ley de la pirámide invertida: Se trata de aplicar este mismo principio periodístico al diseño de páginas web, de tal forma que la información más general y básica se sitúe al inicio de la página y los detalles más abajo. Así el usuario decide con qué profundidad quiere navegar dentro de la página.
  • Coherencia: la coherencia consigue algo muy importante; que toda la aplicación se comporte siempre de manera predecible, tanto en el diseño y ubicación de sus elementos como en su funcionamiento.
  • Atajos: los usuarios más frecuentes deben poder utilizar atajos (p.e. mediante cookies, grabando información personal, guardando el carrito de la compra anterior, etc.).
  • Diálogo: es importante comunicarse con el usuario a través de mensajes de texto, ya sean de error, alerta o confirmación. Deben estar correctamente redactados, ser precisos y dar la oportunidad de cancelar o deshacer una acción. También conviene ofrecer feedback en todo momento, p.e. en procesos de compra guiados y mostrar barras de estado y progreso que informen claramente al usuario de su proceso.
  • Control: el usuario debe tener siempre el mando y una sensación de que controla el proceso, es decir, debe poder modificar sus datos personales, cambiar la dirección de envío de una compra, etc. Es fundamental que tenga la certeza de que puede utilizar la aplicación sin correr peligros ni riesgos. Es decir, que no es posible equivocarse sin que el sistema le advierta antes ni cometer un error sin poder restaurar el estado del proceso. Para ello hay que situar los botones “fatales” en lugares protegidos, nunca en sitios de paso, dotarles de un aspecto acorde a su función y diseñarlos de tal forma que soliciten confirmación.
  • Proximidad: las funciones principales deben aparecer inmediatamente, mientras que otras más avanzadas pueden situarse en un lugar menos visible para los nuevos usuarios. Además, los usuarios deben tener siempre a mano las funcionalidades más utilizadas.
  • Familiaridad: es importante que la interfaz no exija una formación específica y pueda utilizarse directamente. Esto se consigue basándose en conocimientos previos, conceptos e imágenes de la vida real del usuario. Asimismo, resulta interesante emplear las convenciones habituales de las aplicaciones informáticas en general, ya que el usuario aprovecha sus conocimientos previos en esta área.
  • Sencillez: una interfaz llena de funciones avanzadas sólo consigue distraer a los usuarios. Los controles, los elementos y sus relaciones deben tener un significado obvio y comprensible, de tal modo que se entiendan de un solo vistazo.
  • Atractivo: la interfaz debe ser visualmente atractiva y utilizar colores fríos o cálidos que estén en consonancia con el objetivo que se desea alcanzar o las sensaciones que se quieren transmitir.

lunes, 18 de febrero de 2019

Programación Orientada a Objetos (POO)

Pilares de la POO

En la Programación Orientada a Objetos Es un método de implementación en el que los programas se organizan como colecciones cooperativas de objetos, cada uno de los cuales representan una instancia de alguna clase, y cúyas clases son, todas ellas miembros de una jerarquía de clases unidas mediante relaciones de herencia. Existen 4 pilares fundamentales en la POO, los cuales son: Abstracción, Encapsulamiento, Herencia y Polimorfismo. 

Herencia: La herencia es la transmisión del código entre unas clases y otras. Para soportar un mecanismo de herencia tenemos dos clases: la clase padre y la/s clase/s hija/s. La clase padre es la que transmite su código a las clases hijas. En muchos lenguajes de programación se declara la herencia con la palabra "extends".


class Hija extends Padre{ }
Eso quiere decir que todo el código de la clase padre se transmite, tal cual, a la clase hija. Si lo quieres ver así, es como si tuvieras escrito, línea tras línea, todo el código de la clase "Padre" dentro de las llave de la clase "Hija". Por eso, la herencia es fundamental para reutilizar código, porque no necesitas volver a incorporar el código de Padre en Hija, sino que realmente al hacer el "extends" es como si ya estuviera allí.

Abstracción: una clase abstracta es aquella sobre la que no podemos crear especímenes concretos, en la jerga de POO es aquella sobre la que no podemos instanciar objetos, debido a que contiene características muy generales, las cuales se heredaran a clases "Hijas" en las cuales se podrán utilizar.

Encapsulamiento: En programación modular, y más específicamente en programación orientada a objetos, se denomina encapsulamiento al ocultamiento del estado, es decir, de los datos miembro de un objeto de manera que solo se pueda cambiar mediante las operaciones definidas para ese objeto.

Cada objeto está aislado del exterior, es un módulo natural, y la aplicación entera se reduce a un agregado o rompecabezas de objetos. El aislamiento protege a los datos asociados de un objeto contra su modificación por quien no tenga derecho a acceder a ellos, eliminando efectos secundarios e interacciones.
De esta forma el usuario de la clase puede obviar la implementación de los métodos y propiedades para concentrarse solo en cómo usarlos. Por otro lado se evita que el usuario pueda cambiar su estado de maneras imprevistas e incontroladas.

Polimorfismo: En programación orientada a objetos el polimorfismo se refiere a la posibilidad de definir clases diferentes que tienen métodos o atributos denominados de forma idéntica, pero que se comportan de manera distinta. El concepto de polimorfismo se puede aplicar tanto a funciones como a tipos de datos. Así nacen los conceptos de funciones polimórficas y tipos polimórficos. Las primeras son aquellas funciones que pueden evaluarse o ser aplicadas a diferentes tipos de datos de forma indistinta; los tipos polimórficos, por su parte, son aquellos tipos de datos que contienen al menos un elemento cuyo tipo no está especificado.


Clase

Es una plantilla para la creación de objetos de datos según un modelo predefinido. Las clases se utilizan para representar entidades o conceptos, como los sustantivos en el lenguaje. Cada clase es un modelo que define un conjunto de variables-el estado, y métodos apropiados para operar con dichos datos -el comportamiento. Cada objeto creado a partir de la clase se denomina instancia de la clase.

Componente de una clase

Atributo: Los atributos son las características individuales que diferencian un objeto de otro y determinan su apariencia, estado u otras cualidades. Los atributos se guardan en variables denominadas de instancia, y cada objeto particular puede tener valores distintos para estas variables.

Método: Es una subrutina cuyo código es definido en una clase y puede pertenecer tanto a una clase como a un objeto. Un método consiste en generalmente de una serie de sentencias para llevar a cabo una acción, un juego de parámetros de entrada que regularan dicha acción o, posiblemente, un valor de salida (o valor de retorno) de algún tipo.

Parámetro y Argumento

Los parámetros se declaran en la cabecera de la declaración de los métodos. Al declararse el parámetro, se indica el tipo de dato y el identificador correspondiente. Los parámetros o argumentos de un constructor o de un método pueden ser de cualquier tipo, ya sean tipos primitivos o referencias de objetos (en este caso debe indicarse el identificador de la clase correspondiente).

Prácticamente un parámetro es la variable y el argumento es el valor que se le da al parámetro que debe de ser del tipo que se haya especificado en en parámetro.

Métodos con retorno y sin retorno

Un método con retorno es un método el cual se espera que realice una acción y retorne un resultado, método sin retorno se espera que realice una acción sin importar que regrese algo. 

Por ejemplo, en una clase caja podemos crear dos métodos, cuentaObjetos() y vaciaCaja(), el primer método cuenta cuantos objetos existen dentro de la caja y regresa un valor, ese es un método con retorno, y el segundo solamente vacía la caja , por lo que no se espera que regrese algo, este es el método sin retorno.

Métodos de acceso (Getter & Setter)

al crear una clase definimos una parte publica y una parte privada, por lo que estos métodos ya dichos,  son métodos de acceso, lo que significa que generalmente son una interfaz publica para cambiar miembros de las clases privadas.
Los métodos getter y setter se utilizan para definir una propiedad, a estos se accede como propiedades situadas fuera de la clase, aunque las defina dentro de la clase como métodos.



  • Setters: Del Inglés Set, que significa establecer, pues nos sirve para asignar un valor inicial a un atributo, pero de forma explícita,  y solo nos permite dar acceso público a ciertos atributos que deseemos el usuario pueda modificar. Es decir permiten cambiar el valor de los atributos.
  • Getters: Del Inglés Get, que significa obtener, pues nos sirve para obtener (recuperar o acceder) el valor ya asignado a un atributo y utilizarlo para cierto método. Por lo que devuelven el valor de los atributos.

Tipos de Métodos

Métodos de Instancia: Por ejemplo si la clase Enero tuviera un método estático getNumeroDeDiasDelMes() podríamos escribir: int dias = Enero.getNumeroDeDiasDelMes();. La diferencia con un uso de método “normal” es que aquí no invocamos a un objeto, sino a una clase y por ello decimos que un método estático es un método de clase. 

Métodos de Clase o Static: Por ejemplo, los métodos de la clase Arrays del API de Java son métodos estáticos: no los invocamos sobre un objeto, sino sobre una clase. Otra clase que se basa en métodos estáticos es Math. Por ejemplo el método pow (double a, double b) es un método que devuelve la potencia ab. Es un método estático porque no se invoca sobre un objeto. Nosotros podemos crear métodos estáticos en nuestro código. Los interpretaremos como paquetes de código asociados a la clase.


Constructor en POO

un constructor es una subrutina cuya misión es inicializar un objeto de una clase. En el constructor se asignan los valores iniciales del nuevo objeto.

Sobrecarga de Métodos

Algunos métodos en una clase pueden tener el mismo nombre. Estos métodos deben contar con diferentes argumentos. El compilador decide qué método invocar comparando los argumentos. Se generara un error si los métodos tienen definidos los mismos parámetros.


Modificadores de Acceso

Los modificadores de acceso nos introducen al concepto de encapsulamiento. El encapsulamiento busca de alguna forma controlar el acceso a los datos que conforman un objeto o instancia, de este modo podríamos decir que una clase y por ende sus objetos que hacen uso de modificadores de acceso (especialmente privados) son objetos encapsulados.
Los modificadores de acceso permiten dar un nivel de seguridad mayor a nuestras aplicaciones restringiendo el acceso a diferentes atributos, métodos, constructores asegurándonos que el usuario deba seguir una "ruta" especificada por nosotros para acceder a la información.

Es muy posible que nuestras aplicaciones vayan a ser usadas por otros programadores o usuarios con cierto nivel de experiencia; haciendo uso de los modificadores de acceso podremos asegurarnos de que un valor no será modificado incorrectamente por parte de otro programador o usuario.

DEFAULT:
Si no elegimos ningún modificador, se usa el de por defecto, que sólo puede ser accedido por clases que están en el mismo paquete.
PUBLIC:
Este nivel de acceso permite a acceder al elemento desde cualquier clase, independientemente de que esta pertenezca o no al paquete en que se encuentra el elemento.
PRIVATE:
Es el modificador más restrictivo y especifica que los elementos que lo utilizan sólo pueden ser accedidos desde la misma clase en la que se encuentran. Este modificador sólo puede utilizarse sobre los miembros de una clase y sobre interfaces y clases internas, no sobre clases o interfaces de primer nivel, dado que esto no tendría sentido.
PROTECTED:
Indica que los elementos sólo pueden ser accedidos desde su mismo paquete y desde cualquier clase que extienda la clase en que se encuentra, independientemente de si esta se encuentra en el mismo paquete o no. Este modificador, como private, no tiene sentido a nivel de clases o interfaces no internas.
En otras palabras, si determinada clase Hijo hereda el comportamiento de una clase Padre, la clase Hijo tendrá acceso a todos aquellos campos/métodos definidos como protected en Padre, pero no aquellos declarados como private en Padre.

Método Abstracto

Un método abstracto es un método declarado pero no implementado, es decir, es un método del que solo se escribe su nombre, parámetros y tipo devuelto pero no su código.

Los métodos abstractos se escriben sin llaves {} y con ; al final de la declaración.
Por ejemplo:
public abstract area();
Un método se declara como abstracto porque en ese momento (en esa clase) no se conoce cómo va a ser su implementación.
Por ejemplo: A partir de una clase Polígono se pueden derivar las clases Rectángulo y Triángulo. Ambas clases derivadas usarán un método área. Podemos declararlo en Figura como abstracto y dejar que cada clase lo implemente según sus necesidades.
Al incluir el método abstracto en la clase base se obliga a que todas las clases derivadas lo sobrescriban con el mismo formato utilizado en la declaración.
Si una clase contiene un método abstracto se convierte en clase abstracta y debe ser declarada como tal.
La forma general de declarar un método abstracto en Java es:
[modificador] abstract tipoDevuelto nombreMetodo([parámetros]);

Clases Abstractas

En Java se dice que son clases abstractas aquellas clases base (superclases) de las que no se permite la creación de objetos. Para ello, se utiliza la palabra clave abstract

Prácticamente se utiliza solo para crear y nombrar métodos que se utilizaran por otra clase a la hora de heredarse, y en la otra clase se escribira el código para lo que hara ese método.



















Interface en Java


Una interfaz en Java es una colección de métodos abstractos y propiedades constantes.
En las interfaces se especifica qué se debe hacer pero no su implementación. Serán las clases que implementen estas interfaces las que describan la lógica del comportamiento de los métodos.
La principal diferencia entre interface y abstract es que un interface proporciona un mecanismo de encapsulación de los protocolos de los métodos sin forzar al usuario a utilizar la herencia.








Array


Un array es una estructura de datos que nos permite almacenar una gran cantidad de datos de un mismo tipo. El tamaño de los arrays se declara en un primer momento y no puede cambiar en tiempo de ejecución como puede producirse en otros lenguajes.
La declaración de un array en Java y su inicialización se realiza de la siguiente manera:
tipo_dato nombre_array[];
nombre_array = new tipo_dato[tamaño];
Por ejemplo, podríamos declarar un array de caracteres e inicializarlo de la siguiente manera:
char arrayCaracteres[];
arrayCaracteres = new char[10];
Los arrays se numeran desde el elemento cero, que sería el primer elemento, hasta el tamaño-1 que sería el último elemento. Es decir, si tenemos un array de diez elementos, el primer elemento sería el cero y el último elemento sería el nueve.
Para acceder a un elemento especifico utilizaremos los corchetes de la siguiente forma. Entendemos por acceso, tanto el intentar leer el elemento, como asignarle un valor.
arrayCaracteres[numero_elemento];

Collection en Java


Una colección representa un grupo de objetos. Esto objetos son conocidos como elementos. Cuando queremos trabajar con un conjunto de elementos, necesitamos un almacén donde poder guardarlos. En Java, se emplea la interfaz genérica Collection para este propósito. Gracias a esta interfaz, podemos almacenar cualquier tipo de objeto y podemos usar una serie de métodos comunes, como pueden ser: añadir, eliminar, obtener el tamaño de la colección… Partiendo de la interfaz genérica Collection extienden otra serie de interfaces genéricas. Estas subinterfaces aportan distintas funcionalidades sobre la interfaz anterior.

Tipos de Collections

Set

La interfaz Set define una colección que no puede contener elementos duplicados. Esta interfaz contiene, únicamente, los métodos heredados de Collection añadiendo la restricción de que los elementos duplicados están prohibidos. Es importante destacar que, para comprobar si los elementos son elementos duplicados o no lo son, es necesario que dichos elementos tengan implementada, de forma correcta, los métodos equals y hashCode. Para comprobar si dos Set son iguales, se comprobarán si todos los elementos que los componen son iguales sin importar en el orden que ocupen dichos elementos.

Map

La interfaz Map asocia claves a valores. Esta interfaz no puede contener claves duplicadas y; cada una de dichas claves, sólo puede tener asociado un valor como máximo.
Dentro de la interfaz Map existen varios tipos de implementaciones realizadas dentro de la plataforma Java. Vamos a analizar cada una de ellas:
  • HashMap: este implementación almacena las claves en una tabla hash. Es la implementación con mejor rendimiento de todas pero no garantiza ningún orden a la hora de realizar iteraciones. Esta implementación proporciona tiempos constantes en las operaciones básicas siempre y cuando la función hash disperse de forma correcta los elementos dentro de la tabla hash. Es importante definir el tamaño inicial de la tabla ya que este tamaño marcará el rendimiento de esta implementación.
  • TreeMap: esta implementación almacena las claves ordenándolas en función de sus valores. Es bastante más lento que HashMap. Las claves almacenadas deben implementar la interfaz Comparable. Esta implementación garantiza, siempre, un rendimiento de log(N)en las operaciones básicas, debido a la estructura de árbol empleada para almacenar los elementos.
  • LinkedHashMap: esta implementación almacena las claves en función del orden de inserción. Es, simplemente, un poco más costosa que HashMap.










lunes, 11 de febrero de 2019

Fundamentos de JAVA

Estructura Básica de Java


Monografias.com
Para poder programar en Java es necesario tener en cuenta una estructura básica la cual se compone por las siguientes herramientas:

Package: un "package" (o paquete en español) es una agrupación de clases. Es parecido a una "caja" que contiene las clases que queramos mantener en un solo lugar. También podría decirse que los packages es el equivalente a las librerías en otros lenguajes. Esta parte del código no es obligatoria, es sólo si lo necesita usar nuestro programa.
Import: en ocasiones nuestros programas requerirán utilizar clases existentes en otros Packages, y esto se puede lograr con Import.
Clases: Java puede crear diferentes tipos de clases: privadas, públicas y protegidas; y se utilizan de acuerdo a conveniencia de la estructura de nuestro programa. Las clases son sustantivos o moldes







Tipos de Datos en Java

En Java existen 8 tipos de datos primitivos, los cuales se clasifican en: 


  • Números enteros (byteshortintlong).
  • Números reales (floatdouble).
  • Carácter (char).
  • Booleano o lógico (boolean, True o False).
En la tabla se muestran los limites de los tipos de datos.

Variable

Las variables Java son un espacio de memoria en el que guardamos un determinado valor (o dato), el cual sera de un tipo de dato, que se le asignara a la hora de crear la variable. Java maneja tres tipos de variables: de instancia, de clase y locales.
  • Las variables de instancia son las que se usan para guardar valores o atributos de un objeto en particular.
  • Las variables de clase son las que guardan valores o atributos de la clase.
  • Las variables locales son las que se declaran en una función o método y solamente las puede utilizar esa función o método, de ahí el nombre de locales.

Constantes

Una constante es una variable del sistema que mantiene un valor inmutable a lo largo de toda la vida del programa. Las constantes en Java se definen mediante el modificador final.

Identificadores

Se llaman así los nombres de las variables,  clases,  objetos y métodos de los programas Java. No pueden ser identificadores las palabras claves ni las palabras reservadas del lenguaje Java.
Existen identificadores válidos y no válidos como los que se muestran en la siguiente tabla: 


Palabras Reservadas

En este capítulo tenéis un listado de las palabras reservadas de Java orientado a objetos. Las palabras reservadas son identificadores, pero como su nombre indica, estas palabras están reservadas, y no se pueden usar como identificadores de usuario. Por ejemplo: 


 Comentarios en Java

En java se pueden utilizar 2 tipos de comentarios, los cuales son:

Comentario Tradicional:

  • Empieza con los caracteres /* y acaba con */.
  • Pueden ocupar más de una línea y pueden aparecer en cualquier lugar donde pueda aparear un espacio en blanco. 
  • No pueden anidarse.
Comentarios de una sola línea:

  • Comienzan con una doble barra ( // ) 
  • Pueden escribirse al principio de la línea o a continuación de una instrucción.
  • No tienen carácter de terminación. 

Tipos de operadores

Operador de Asignación

El operador Java más sencillo es el operador de asignación. Mediante este operador se asigna un valor a una variable. El operador de asignación es el símbolo igual.



Operador Aritmético

Los operadores aritméticos en Java son los operadores que nos permiten realizar operaciones matemáticas: suma, resta, multiplicación, división y resto.
Los operadores aritméticos en Java son:










Operador Aritmético Incremental y Combinados

En Java existen un par de operadores aritméticos que nos van a permitir incrementar (++) o decrementar (--) en una unidad el valor de una variable. Estos dos operadores pueden colocarse antes (prefijos) o después (sufijos) de la variable. De esta forma, podemos incrementar el valor de una variable de tipo int de la siguiente forma:


Operador de Relación


En java disponemos de los operadores relacionales para verificar si se cumple una relación. Por ejemplo el operador de equivalencia ( == ) nos devuelve un valor de verdadero si los operandos son iguales. Estas operaciones comparan dos valores numéricos y devuelven un valor booleano.



Operador Lógico


En Java disponemos de los operadores lógicos habituales en lenguajes de programación como son “es igual”, “es distinto”, menor, menor o igual, mayor, mayor o igual, and (y), or (o) y not (no). La sintaxis se basa en símbolos como veremos a continuación y cabe destacar que hay que prestar atención a no confundir == con = porque implican distintas cosas.



Clase Math


En cuanto a las funciones matemáticas en Java, las funciones disponibles vienen definidas en la clase Math. Hay muchas funciones disponibles, algunas de ellas son:




Estructuras Básicas de Control

IF

La estructura condicional más simple en Java es el if, se evalúa una condición y en caso de que se cumpla se ejecuta el contenido entre las llaves {} o en caso de que se omitan se ejecuta el código hasta el primer “;”.

Un claro ejemplo es la imagen al lado derecho.















IF/ELSE

Con el if solo podemos hacer que se ejecute un fragmento de código o no pero en el caso de que no se cumpla la condición no se hace nada (sigue el flujo normal de ejecución) por lo que si queremos que se ejecute otra cosa cuando no se cumpla la condición solo con el if tenemos que hacer otro con la condición inversa provocando que se tenga que comprobar la condición 2 veces mientras que si usamos el else solo necesitamos hacer la comprobación una sola vez.

IF/ELSE/ELSE/IF


El siguiente nivel es hacer el else condicional añadiendo un if para que si no se cumple la primera condición (la del if principal) se evalúe esta nueva condición de modo que se puede concatenar la cantidad de if else que se necesiten para cubrir todos los distintos escenarios que precisen ser tratados de una forma particular, siendo el ultimo else el que se ejecute cuando no se cumpla ninguna condición (el else es siempre opcional).



WHILE

El bucle while es tan sencillo como decir mientras se cumpla la condición se ejecuta el código que haya dentro del bucle, y en el momento que ya no se cumpla esa condición se sale del bucle.







DO... WHILE


Esta claro que al menos se tiene que ejecutar una vez para tener un número aleatorio y si el número aleatorio no es par pues tendrá que repetirse hasta que si que lo sea.






FOR

En java hay dos posibles tipos de bucle for:
El más habitual es en el que se establece el numero desde el que va a empezar el bucle, hasta cuando se va a seguir ejecutando el bucle y finalmente el modo en el que se actualiza el contador del bucle, que aunque habitualmente lo que se hace es incrementar en una unidad el contador esto no tiene que ser obligatoriamente así.





El otro formato de bucle for es el ideal para recorrer colecciones de objetos sean del tipo que sean (arrays, ArrayList, HashMap, ...) y en este caso hay que definir un iterador que nos devolverá un elemento de la colección en cada iteración y la colección que se quiere recorrer.