Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Vamos a trabajar con la entrada y salida de datos por consola que hará que los
tutoriales siguientes sean mucho más didácticos y entretenidos.
Para la entrada de datos utilizaremos la clase Scanner, que tiene un
método next() que nos da la siguiente entrada por consola y que guardaremos en
la variable "entrada".
Para la salida de datos seguiremos utilizando la instrucción "System.out.println(x)"
como en los anteriores video tutoriales
La clase Tutorial4, que tenemos a continuación, nos muestra el código del
programa:
package tutorial4.edu4java.com;
import java.util.Scanner;
Instrucción if o sentencia if
Las instrucciones de control de flujo, como if else y switch, cambian el flujo de la
ejecución del programa en tiempo de ejecución según ciertas condiciones.
La forma general de la sentencia if es:
if (condición)
sentencia;
if (condición){
sentencia1;
sentencia2;
}
Podemos jugar con las condiciones que queramos a partir del ejemplo del video
tutorial:
package com.edu4java.tutorial5;
if (condición)
sentencia1;
else
sentencia2
Las dos primeras líneas indican que si la condición es verdadera se ejecuta la
sentencia 1. La palabra clave else, significa que si la condición no es verdadera se
ejecuta la sentencia 2.
Dado que las sentencias pueden ser simples o compuestas la forma general de
if...else es
if (condición){
sentencia1;
sentencia2;
}else{
sentencia3
sentencia4;
sentencia5;
}
package com.edu4java.tutorial5;
package com.edu4java.tutorial5;
import java.util.Scanner;
Los Operadores lógicos son los operadores que funcionan con valores booleanos;
los valores son verdaderos o falsos.
package com.edu4java.tutorial6;
import java.util.Scanner;
}
Instrucción switch o sentencia switch
Otra manera de controlar el flujo de un programa, es con una sentencia switch. La
sentencia switch te da la opción de testear un rango de valores de variables. Se
pueden utilizar en caso de sentencias if-else complejas o excesivamentes largas.
La estructura de una sentencia switch es:
switch ( variable_to_test ) {
case value:
code_here;
break;
case value:
code_here;
break;
default:
values_not_caught_above;
break;
}
Comienza con la palabra "switch", seguido de la variable a chequear, entre
paréntesis. El resto de la sentencia switch va entre llaves. Cada caso a testear,
empieza con la palabra "case", seguido del valor del variable: case value:
A continuación viene el código a ejecutar, seguido de la palabra "break", necesaria
para salir de cada caso de la sentencia switch.
El valor "default" del final, es opcional. Se incluye cuando puede haber más valores
de la variable que no han sido chequeados en el switch.
A continuación tenemos el código del video tutorial:
package com.edu4java.tutorial7;
import java.util.Scanner;
System.out.print("mostrar el resultado:");
System.out.println(resultado);
}
}
while (expresion) {
sentencia(s)
}
while (verdadero){
// código a ejecutar
}
El lenguaje de programación Java también tiene la sentencia do-while, con
sintaxis;
do {
sentencia(s)
} while (expresion);
La diferencia entre "while" y el "do-while" es que el "do-while" evalúa la expresión
al final del bucle, en vez de al principio. Debido a esto, las instrucciones dentro del
bucle se ejecutan por lo menos una vez.
En los dos ejemplos siguientes, que están explicados en el video tutorial, podemos
ver como funciona la sentencia while:
package com.edu4java.tutorial8;
package com.edu4java.tutorial8;
import java.util.Scanner;
La sentencia for, nos ofrece una manera de iterar sobre un rango de valores. Se le
llama "bucle for", porque da vueltas al bucle hasta que la condición se cumple.
-Finalmente, la última parte especifica como serán manipulados los valores iniciales
en cada iteración del ciclo.
Arrays
Otro concepto de programación que se debe conocer, para desarrollar un código
eficazmente, es el array.
Un array es una forma de guardar más de un valor al mismo tiempo. Piensa que un
array es como las columnas en una hoja de cálculo, en donde cada fila tiene un
número de posición, igual que los arrays. Las posiciones en un array empiezan en
0 y ascienden secuencialmente. Cada posición en un array puede contener un valor.
Sintaxis de una array;
Igual que las variables de otros tipos, la declaración de un array tiene dos
componentes; el tipo del array y su nombre.
El tipo del array se escribe como tipo[], donde el tipo es el tipo del dato de los
elementos contenidos en el array; los corchetes son símbolos indicando que esa
variable contiene un array.
El nombre de un array debe seguir las reglas y convenciones igual que el resto de
las variables.
Para definir cuantas posiciones queremos que tenga el array, tendremos que crear
un objeto array de la siguiente manera:
Primero vendrá el nombre del array, seguido del signo =. Después vendrá la palabra
clave new y a continuación el tipo de data de nuevo. Después unos corchetes que
tendrán dentro el tamaño del array. El tamaño se refiere a la cantidad de posiciones
que tendrá el array.
package com.edu4java.Tutorial9;
En este tutorial, analizamos el uso de la palabra clave static, para crear atributos
y métodos que pertenecen a una clase y no a la instancia de una clase.
Cuando se crean varios objetos a partir del mismo molde, cada uno tiene sus
propias copias de variables de instancia.
Cuando se quiere tener variables comunes a todos los objetos, se consigue creando
variables estáticas. Las variables que tienen la palabra static en su declaración, se
llaman atributos estáticos o variables de clase. En el caso de la clase "Tutorial10",
las variables de clase son array y scanner. Están asociadas a la clase, en vez de
al objeto.
Todas las instancias de la clase comparten la variable de clase, que tiene una
posición fija en la memoria. Cualquier objeto puede cambiar el valor de la variable
de clase, pero las variables de clase también pueden ser manipuladas sin crear una
instancia de la clase.
ClassName.methodName(args)
Los métodos estáticos se suelen utilizar para acceder a las propiedades estáticas,
como veremos en el Tutorial 13, JavaBeans, public y private.".
package com.edu4java.Tutorial10;
import java.util.Scanner;
Parámetros y argumentos
Estos dos términos; parámetros y argumentos, son a menudo intercambiados
incorrectamente en su uso. El contexto ayuda a diferenciar su significado. El
término parámetro, se usa a menudo para referirse a la variable en la declaración
del método, mientras que argumento, se refiere al valor que se envia. Para evitar
confusiones, es común ver a un parámetro como una variable y un argumento como
un valor.
Cualquier método que esté declarado como void, no devolverá ningún valor.
Cualquier método que no sea declarado void, deberá contener una sentencia return
con su correspondiente valor de retorno;
return valorRetorno;
El tipo de dato del valor de retorno deberá coincidir con el tipo de retorno de la
declaración del método. No se puede retornar un valor integer, a un método en el
que en su declaración aparece como valor de retorno, un boolean.
package com.edu4java.Tutorial11;
import java.util.Scanner;
insertarDatosArray(array, scanner);
sumarArray(array);
int max = maxArray(array);
System.out.println("Max= " + max);
}
}
package com.edu4java.tutorial11;
package com.edu4java.tutorial11;
/**
* @author Eli
* A class is a mould from which we can create objects or instances
* An object is an instance of a class
*/
public class Dog {
//object variables
}
}
printToConsole(dog1);
printToConsole(dog2);
}
}
Ahora tenemos dos objetos que pertenecen a la misma clase Dog. Cada
objeto lo tenemos guardado en una variable distinta; dog1 y dog2. Para
ver como funciona he creado un método que los imprime;
printToConsole(Dog dog).
En este tutorial vamos a definir las palabras "public", "private" y a hablar del
concepto "javabean".
Hasta ahora veiamos que las variables eran "public" y se podían acceder desde el
exterior de su propia clase, cuando en este ejemplo cambiamos la variable name
de "public" a "private" vemos que desde el main de la Clase Tutorial12 ya no
podemos acceder a ella de la manera en que lo haciamos hasta ahora. La palabra
"private" hace que no se pueda acceder a esa variable.
package com.edu4java.tutorial12;
/**
* A class is a mould from which we can create objects or instances
* An object is an instance of a class
*
* JavaBeans are reusable software components for Java
* that can be manipulated visually in a builder tool.
*/
public class Dog {
// instance variables
}
}
package com.edu4java.tutorial12;
// printToConsole(dog1);
// printToConsole(dog2);
}
}
Relacionado con el acceso a los datos tenemos el concepto JavaBean; que según la
especificación de Sun Microsystems los define como "componentes de software
reutilizables que se puedan manipular visualmente en una herramienta de
construcción".
Para funcionar como una clase JavaBean, una clase debe obedecer ciertas
convenciones sobre nomenclatura de métodos, construcción y comportamiento.
Una de estas convenciones es que sus propiedades deben ser accesibles mediante
métodos get y set que siguen una convención de nomenclatura estándar.
package com.edu4java.tutorial12;
/**
* A class is a mould from which we can create objects or instances
* An object is an instance of a class
*
* JavaBeans are reusable software components for Java
* that can be manipulated visually in a builder tool.
*/
public class Dog {
// instance variables
}
}
package com.edu4java.tutorial12;
// printToConsole(dog1);
// printToConsole(dog2);
}
Para poder comprender esto vamos a verlo en un ejemplo. En este ejemplo vamos
a crear un hotel para perros, donde vamos a registrarlos mediante su nombre, peso
y color, reutilizando la clase Dog de los pasados tutoriales.
package com.edu4java.tutorial13;
/**
* A class is a mould from which we can create objects or instances
* An object is an instance of a class
*
* JavaBeans are reusable software components for Java
* that can be manipulated visually in a builder tool.
*/
public class Dog {
// instance variables
}
}
Después de registrar los perros con el método insertDog(), los imprimimos por
consola para mostrar cada uno de los perros. En la siguiente instrucción de la clase
"Tutorial13", les damos de comer 500gr de comida con el método feed(dogs) y los
volvermos a imprimir para ver que pesan 500gramos más.
package com.edu4java.tutorial13;
// list of Dogs
String[] names = { "Coco", "Sultan", "Boby", "Drak" };
String[] colours = { "brown", "black", "white", "blue"
};
double[] weight = { 1.5, 75, 3.5, 45.1 };
}
return dogs;
}
}
Ahora queremos añadir una nueva propiedad a nuestro perro; "portion" (ración).
No podemos modificar la clase "Dog" porque está siendo utilizada en otras clases,
por lo que creamos una nueva clase Dog2 extendiéndola de Dog, con la nueva
propiedad "portion". De esta manera tenemos una clase Dog2 con todas las
propiedades de nuestra antigua clase Dog; "name", "colour" y "weight" y además
una nueva propiedad "portion", añadida en la clase Dog2.
package com.edu4java.tutorial13;
}
Ahora sustituimos Dog por Dog2 y trabajamos con esta nueva clase, para darle de
comer a cada perro, una ración específica, dependiendo de su peso;
package com.edu4java.tutorial13;
// list of Dogs
String[] names = { "Coco", "Sultan", "Boby", "Drak" };
String[] colours = { "brown", "black", "white", "blue"
};
double[] weight = { 1.5, 75, 3.5, 45.1 };
double[] portion = { 0.2, 1, 0.2, 0.8 };
}
return dogs;
}
En este tutorial vamos a continuar con el ejemplo del hotel de perros que hemos
estado haciendo en los anteriores tutoriales, para explicar las palabras "override,
protected y super".
package com.edu4java.tutorial14;
// list of Dogs
String[] names = { "Coco", "Sultan", "Boby", "Drak" };
String[] colours = { "brown", "black", "white", "blue"
};
double[] weight = { 1.5, 75, 3.5, 45.1 };
double[] portion = { 0.2, 1, 0.2, 0.8 };
}
return dogs;
}
}
En la clase Dog, introduciremos el concepto de protected, haciendo que la variable
colour sea accesible desde la clase hija Dog2.
package com.edu4java.tutorial14;
/**
* A class is a mould from which we can create objects or instances
* An object is an instance of a class
*
* JavaBeans are reusable software components for Java
* that can be manipulated visually in a builder tool.
*/
public class Dog {
// instance variables
private String name;
private double weight;
protected String colour;
}
}
En la clase Dog2 conseguimos imprimir la variable "portion" sin tener que modificar
la clase Dog, sobreescribiendo el método printOnConsole.
package com.edu4java.tutorial14;
Cualquier objeto java que pueda pasar más de un test "ES-UN" es considerado
polimórfico. En Java, todos los objetos son polimórficos ya que cualquier objeto
pasaría un test "ES-UN" dado que son de su propio tipo, además del de la clase
Object.
}
public class B {
public void print() {
System.out.println("B");
}
}
public class C extends B {
public void print() {
System.out.println("C");
}
}
public class Main {
public static void main(String[] args) {
B[] bs = new B[3];
bs[0] = new B();
bs[1] = new A();
bs[2] = new C();
naivePrinter(bs);
}
}
Interfaces
Una interface en Java, es un tipo abstracto que se utiliza para definir una interfaz
a implementar por las clases. Las interfaces se declaran utilizando la palabra
clave interface y conteniendo solamente la firma del método y las declaraciones
de las constantes (que pueden ser static y final). Una interfaz no puede contener
las definiciones de los métodos.
Las interfaces son implementadas y no pueden ser instanciadas. Una clase que
implementa una interfaz debe implementar todos los métodos descritos en la
interfaz.
Una ventaja del uso de las interfaces es que simulan la herencia múltiple. Todas las
clases en Java tienen solamente una clase base, la única excepción es
java.lang.Object (la clase raiz del sistema tipo de Java); la herencia múltiple de
clase no está permitida.
Para explicar el concepto de interfaces, vamos a jugar al bingo y para esto vamos
a crear 20 tarjetas de bingo, con 15 números en cada una de las tarjetas.
Primero, creamos una clase Main con un new ArrayList de Bingo Cards(tarjetas de
bingo). Después de añadir cada una de las tarjetas a la lista, las imprimimos.
package com.edu4java.tutorial16;
import java.util.ArrayList;
Utilizamos un for para iterar sobre el array y en cada bucle, añadimos un número,
sorteado entre los números 0 a 99.
Sorteamos los números, los incluimos en el array de ints "bingo", para que estén
guardados en una variable de instancia de "BingoCard" y cada vez que se llame al
método "syso", llamamos al método "toString()".
El método "toString", itera sobre el array de ints "bingo", concatenando cada uno
de ellos con el anterior e imprimiéndolos.
package com.edu4java.tutorial16;
import java.util.Random;
public BingoCard() {
Random random = new Random();
for (int i = 0; i < bingo.length; i++) {
bingo[i] = random.nextInt(100);
}
}
@Override
public String toString() {
String s = "[";
for (int i = 0; i < bingo.length; i++) {
s = s + bingo[i] + ",";
}
return s + "]";
package com.edu4java.tutorial16;
import java.util.Random;
public BingoCard1() {
Random random = new Random();
for (int i = 0; i < bingo.length; i++) {
bingo[i] = random.nextInt(100);
if (isRepeated(i)) {
i--;
}
}
}
@Override
public String toString() {
String s = "[";
for (int i = 0; i < bingo.length; i++) {
s = s + bingo[i] + ",";
}
return s + "]";
package com.edu4java.tutorial16;
import java.util.Random;
public BingoCard2() {
Random random = new Random();
for (int i = 0; i < bingo.length; i++) {
bingo[i] = random.nextInt(100);
}
}
}
}
System.out.println("]");
}
Cada vez que hacemos una mejora, tenemos que cambiar mucho código en la clase
Main. Esto puede ser bastante problemático cuando tenemos miles de clases. Para
evitar esto, definimos una interface;
package com.edu4java.tutorial16;
void syso();
}
Y hacemos que todas las clases BingoCard implementen la interfaz IBingoCard y
sus métodos;
package com.edu4java.tutorial16;
import java.util.Random;
public BingoCard() {
Random random = new Random();
for (int i = 0; i < bingo.length; i++) {
bingo[i] = random.nextInt(100);
}
}
@Override
public String toString() {
String s = "[";
for (int i = 0; i < bingo.length; i++) {
s = s + bingo[i] + ",";
}
return s + "]";
/* (non-Javadoc)
* @see com.edu4java.tutorial16.IBingoCard#syso()
*/
@Override
public void syso() {
System.out.println(this.toString());
}
package com.edu4java.tutorial16;
import java.util.Random;
public BingoCard1() {
Random random = new Random();
for (int i = 0; i < bingo.length; i++) {
bingo[i] = random.nextInt(100);
if (isRepeated(i)) {
i--;
}
}
}
private boolean isRepeated(int i) {
for (int j = 0; j < i; j++) {
if (bingo[i] == bingo[j]) {
return true;
}
}
return false;
}
@Override
public String toString() {
String s = "[";
for (int i = 0; i < bingo.length; i++) {
s = s + bingo[i] + ",";
}
return s + "]";
}
@Override
public void syso() {
System.out.println(this.toString());
}
}
package com.edu4java.tutorial16;
import java.util.Random;
public BingoCard2() {
Random random = new Random();
for (int i = 0; i < bingo.length; i++) {
bingo[i] = random.nextInt(100);
}
}
@Override
public void syso() {
System.out.print("[");
for (int i = 0; i < bingo.length; i++) {
System.out.print(bingo[i]);
if (i + 1 < bingo.length) {
System.out.print(",");
}
}
System.out.println("]");
}
Por último, utilizamos esa interfaz en la clase Main. La podemos usar por ejemplo
para probar la clase BingoCard2 y solamente tendremos que modificar la clase Main
en un lugar;
package com.edu4java.tutorial16;
import java.util.ArrayList;