martes, 4 de julio de 2017

Estructuras de salto en Java



En Java existen dos sentencias que permiten modificar el flujo secuencial de un programa y provocan un salto en la ejecución. Estas sentencias son break y continue. Ambas se utilizan con las estructuras de repetición para interrumpir la ejecución con break o volver al principio con continue.
Además, el break se utiliza para interrumpir la ejecución de un switch.

Sentencia break
La sentencia break se utiliza para interrumpir la ejecución de una estructura de repetición o de un switch. Cuando se ejecuta el break, el flujo del programa continúa en la sentencia inmediatamente posterior a la estructura de repetición o al switch.


Sentencia continue
La sentencia continue únicamente puede aparecer en una estructura de repetición. Cuando se ejecuta un continue, se deja de ejecutar el resto del bloque de sentencias de la estructura iterativa para volver al inicio de ésta.

Uso de break y continue
A continuación se muestran ejemplos del uso de las sentencias break y
continue.

Ejemplo de uso de break en un switch:
Desarrolle un programa que cuente el número de vocales, consonantes y espacios de una cadena de caracteres.
Utilice un for para comparar cada una de las letras de la frase. Dentro del for utilice un switch para seleccionar entre vocales, consonantes y espacios. Las variables vocales, consonantes y espacios se inicializan a cero y se utilizan para contar el número de veces que aparecen en la frase.
Defina una variable letra de tipo char. Almacene la letra correspondiente a la posición i de la cadena de caracteres. Utilice el método charAt(i) de la clase String para copiar el valor de este carácter a la variable letra.
Utilice la sentencia break al final del bloque de sentencias de los case correspondientes a vocales, espacios y consonantes.

public class ConsonantesVocales {
public static void main(String[] args) {
String frase = "Hola Mundo";
char letra;
int vocales = 0, consonantes = 0, espacios = 0;
for (int i=0; i<frase.length(); i++) {
letra = frase.charAt(i);
switch (letra) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case 'A':
case 'E':
case 'I':
case 'O':
case 'U': vocales++;
break;
case ' ': espacios++;
break;
default: consonantes++;
break;
}
}
System.out.println("La frase '" + frase + "' tiene " +
vocales + " vocales, " +
consonantes + " consonantes y " +
espacios + " espacios. ");
}
}


Ejemplo de uso de break en un do-while:
Modifique el programa de los números aleatorios desarrollado en el ejemplo de uso de un do-while.
Incluya un break que interrumpa el do-while cuando el número aleatorio sea igual a 25.
El programa debe terminar cuando el número aleatorio sea 25 o 50.

public class NumerosAleatoriosConBreak {
public static void main(String[] args) {
// este programa muestra números enteros aleatorios
// entre 0 y 100 hasta que sale el 25 o el 50
do {
numero = (int) (100 * Math.random());
System.out.println("Número aleatorio: " + numero);
if (numero == 25)
break;
} while (numero != 50);
}
}


Ejemplo de uso de continue en un for:
Desarrolle un programa que muestre por consola los números pares entre 2 y 10. 
Utilice un for para valores de i de 1 a 10 y aplique la sentencia continue para interrumpir la ejecución de las iteraciones impares.

public class NumerosPares {
public static void main(String[] args) {
for (int i=1; i<=10; i++) {
if (i % 2 != 0)
continue; //el número es impar, se interrumpe la iteración
System.out.println("Números pares: " + i);
}
}

}

Todo sobre: Objetos en Java

Objetos
Un objeto se compone de atributos y métodos. Para acceder a los elementos de un objeto se escribe el nombre del objeto, un punto y el nombre del elemento al que se desea acceder.

Por ejemplo, para los objetos vehiculo1 y vehiculo2, se podría acceder directamente a sus atributos como se muestra a continuación:



Vehiculo vehiculo1 = new Vehiculo("4050 ABJ",
"VW", "GTI",
"Blanco",
100.0);
System.out.println("Matricula : " +
vehiculo1.matricula);
System.out.println("Marca y modelo: " +
vehiculo1.marca + " " +
vehiculo1.modelo);
System.out.println("Color : " +
vehiculo1.color);
System.out.println("Tarifa : " +
vehiculo1.tarifa);

La salida por la consola:
Matrícula : 4050 ABJ
Marca y modelo: VW GTI
Color : Blanco
Tarifa : 100.0

Para acceder a un método, además de su nombre hay que indicar la lista de argumentos requeridos por el método. Cuando la declaración del método no incluye parámetros no es necesario pasar argumentos.

El siguiente código Java crea el objeto vehiculo1 y muestra su matrícula y su tarifa. A continuación modifica la tarifa a 90.0 euros y la muestra de nuevo.

Vehiculo vehiculo1 = new Vehiculo("4050 ABJ",
"VW",
"GTI",
"Blanco",
100.0);
System.out.println("Matricula : " +
vehiculo1.getMatricula());
System.out.println("Tarifa : " +
vehiculo1.getTarifa());
vehiculo1.setTarifa(90.0);
System.out.println("Matricula : " +
vehiculo1.getMatricula());
System.out.println("Tarifa : " +
vehiculo1.getTarifa());

La salida por la consola:
Matrícula : 4050 ABJ
Tarifa : 100.0
Matrícula : 4050 ABJ
Tarifa : 90.0

Para mostrar la tarifa del objeto vehiculo1 se puede acceder directamente al atributo tarifa del objeto o se puede ejecutar el método getTarifa().
Esto se debe a que los atributos de clase Vehiculo son de acceso público porque se han declarado public en vez de private. Los atributos de la clase se deben declarar private y para acceder a ellos se debe utilizar un método ‘get’.


La referencia null
Una referencia a un objeto puede no tener asignada una instancia. Esto puede ocurrir porque se ha declarado el objeto pero no se ha instanciado, es decir no se ha creado un objeto con el operador new. Existe un valor especial, llamado null que indica que un objeto no se ha instanciado. 
A continuación se declara el objeto vehiculo2, pero no se crea una instancia para él.

Vehiculo vehiculo2;

Mientras no se instancie el objeto vehiculo2 su referencia vale null. En un programa Java no se deben dejar referencias de objetos sin instanciar.
Es necesario asegurarse que los objetos existen para evitar referencias null.

El objeto se puede instanciar en la misma declaración o más adelante, como se muestra en el siguiente ejemplo.

Vehiculo vehiculo2;
// el objeto vehiculo2 se declara pero no se instancia
// la instancia se crea utilizando el operador new
Vehiculo vehiculo2 = new Vehiculo("2345 JVM",
"SEAT",
"León",
"Negro",
80.0);

Para saber si una referencia está instanciada o no, se puede comparar con null.

if (vehiculo2 == null) {
System.out.print("vehiculo2 es una referencia null")
}
if (vehiculo2 != null) {
System.out.print("vehiculo2 está instanciado")
}

Si vehiculo2 es null, la primera expresión es true y la segunda false.
En ese caso, el programa muestra por la consola el mensaje:

vehiculo2 es una referencia null


Referencias compartidas por varios objetos
Un objeto puede tener varias referencias o nombres. Un alias es otro nombre que se referencia al mismo objeto. Un alias es una referencia más al mismo espacio de memoria del objeto original. Por ejemplo, si se crea el objeto vehiculo1 y después se declara otro objeto vehiculo3 y a continuación se asigna la referencia de vehiculo1 a vehiculo3, entonces vehiculo3 es un alias de vehiculo1. Esto significa que el espacio de memoria de vehiculo1 y vehiculo3 es el mismo.

Vehiculo vehiculo1;
Vehiculo vehiculo3;
vehiculo1 = new Vehiculo("4050 ABJ",
"VW",
"GTI",
"Blanco",
100.0);
// el objeto vehiculo1 se instancia, vehiculo3 solo
// está declarado y es una referencia null
vehiculo3 = vehiculo1;
// al asignar la referencia de vehiculo1 a vehiculo3,
// éste se convierte en alias de vehiculo1 y referencia
// el mismo espacio de memoria
System.out.println("Matricula : " +
vehiculo1.getMatricula());
System.out.println("Tarifa : " +
vehiculo1.getTarifa());
// se muestra la matricula y la tarifa de vehiculo1
System.out.println("Matricula : " +
vehiculo3.getMatricula());
System.out.println("Tarifa : " +
vehiculo3.getTarifa());
// se muestra la matricula y la tarifa de vehiculo3,
// un alias de vehiculo1, por lo que muestra de nuevo
// la información correspondiente a vehiculo1

La salida por la consola muestra dos veces los valores asignados al objeto
vehiculo1.
Matrícula : 4050 ABJ
Tarifa : 100.0
Matrícula : 4050 ABJ
Tarifa : 100.0

Un alias se puede utilizar para mostrar el estado de un objeto y también para  modificarlo. 

Si se ejecuta setTarifa(90.0) con el objeto vehiculo3 en realidad se modifica la tarifa de vehiculo1. vehiculo3.setTarifa(90.0);

// al modificar la tarifa de vehiculo3 en realidad se
// modifica la tarifa de vehiculo1
System.out.println("Matricula : " +
vehiculo1.getMatricula());
System.out.println("Tarifa : " +
vehiculo1.getTarifa());
System.out.println("Matricula : " +
vehiculo3.getMatricula());
System.out.println("Tarifa : " +
vehiculo3.getTarifa());

Se muestra la matrícula y la tarifa de vehiculo1 y vehiculo3.
Matrícula : 4050 ABJ
Tarifa : 90.0
Matrícula : 4050 ABJ
Tarifa : 90.0

El objeto vehiculo3 es un alias de vehiculo1 y no tiene un espacio de memoria propio. Utiliza el mismo espacio de memoria que vehiculo1. Es decir, vehiculo1 comparte con sus alias el mismo espacio de memoria. Si se modifica el valor de la tarifa almacenada en vehiculo3, en realidad se modifica el valor de vehiculo1.

Esquemáticamente, un alias se puede ver como un objeto que apunta al espacio de memoria de otro objeto, como se muestra a continuación:



En este esquema, el objeto vehiculo3 es un alias de vehiculo1 y ambos objetos comparten el mismo espacio de memoria. El objeto vehiculo2, tiene su espacio de memoria propio y no lo comparte con otro objeto.


El ciclo de vida de un objeto
El ciclo de vida de un objeto empieza por su declaración, su instanciación y su uso en un programa Java hasta que finalmente desaparece.


Cuando un objeto deja de ser utilizado, Java libera la memoria asignada al objeto y la reutiliza. El entorno de ejecución de Java decide cuándo puede reutilizar la memoria de un objeto que ha dejado de ser útil en un programa. El programador no debe preocuparse de liberar la memoria utilizada por los objetos. A este proceso se le conoce como recolección de basura. Java cuenta con un sistema recolector de basura que se encarga de liberar los objetos y los espacios de memoria que ocupan cuando éstos dejan de ser utilizados en un programa.

Representación de clases y objetos en Java


Representación de la clase vehículo utilizando un diagrama de clases.


Una clase se representa como un recuadro dividido en tres partes: el nombre de la clase en la parte superior, la declaración de atributos y la declaración de métodos.

El código Java de una clase se divide en dos partes, la declaración y su definición. La declaración comienza por la palabra class y a continuación se indica el nombre de la clase. 

La definición de una clase queda delimitada por la llave de inicio { y la llave de fin }. En el bloque de definición de la clase se declaran los atributos de los objetos y los métodos que definen su comportamiento.

Los objetos se representan como cajas que indican el nombre del objeto, la clase a la que pertenecen y el estado del objeto.


En este ejemplo, los objetos vehiculo1 y vehiculo2 son instancias de la clase Vehiculo. Ambos objetos comparten los mismos atributos, pero almacenan distintos valores. Los valores almacenados en un objeto representan su estado. El estado del objeto vehiculo1 almacena los valores: matricula “4050 ABJ”, marca “VW”, modelo “GTI”, color “Blanco”, tarifa 100.0 y disponible true. El estado del objeto vehiculo2 almacena matricula “2345 JVM”, marca “SEAT”, modelo “León”, color “Negro”, tarifa 80.0 y disponible false.

El estado de un objeto puede cambiar durante la ejecución de un programa Java. En este ejemplo, se podría modificar la tarifa del alquiler y la disponibilidad de los objetos de la clase Vehiculo, el resto de los atributos no se pueden modificar.