1. Introducción a Java

 

1.1. Introducción a Java

Java es un lenguaje de programación creado por Sun Microsystems para poder funcionar en distintos tipos de procesadores. Su sintaxis es muy parecida a la de C o C++, e incorpora como propias algunas características que en otros lenguajes son extensiones: gestión de hilos, ejecución remota, etc.

El código Java, una vez compilado, puede llevarse sin modificación alguna sobre cualquier máquina, y ejecutarlo. Esto se debe a que el código se ejecuta sobre una máquina hipotética o virtual, la Java Virtual Machine, que se encarga de interpretar el código (ficheros compilados .class) y convertirlo a código particular de la CPU que se esté utilizando (siempre que se soporte dicha máquina virtual).

Cuando se programa con Java, se dispone de antemano de un conjunto de clases ya implementadas. Estas clases (aparte de las que pueda hacer el usuario) forman parte del propio lenguaje (lo que se conoce como API (Application Programming Interface) de Java).

 

1.2. Introduccion a la Programación Orientada a Objetos (POO)

 

1.2.1. Objetos y clases

 

1.2.2. Campos, métodos y constructores

 

1.2.3. Herencia y polimorfismo

Con la herencia podemos definir una clase a partir de otra que ya exista, de forma que la nueva clase tendrá todas las variables y métodos de la clase a partir de la que se crea, más las variables y métodos nuevos que necesite. A la clase base a partir de la cual se crea la nueva clase se le llama superclase.

Figura 1. Ejemplo de herencia


Por ejemplo, tenemos una clase genérica Animal, y heredamos de ella para formar clases más específicas, como Pato , Elefante, o León. Si tenemos por ejemplo el método dibuja(Animal a), podremos pasarle a este método como parámetro tanto un Animal como un Pato, Elefante, etc. Esto se conoce como polimorfismo .

 

1.2.4. Clases abstractas e interfaces

Mediante las clases abstractas y los interfaces podemos definir el esqueleto de una familia de clases, de forma que los subtipos de la clase abstracta o la interfaz implementen ese esqueleto para dicho subtipo concreto. Por ejemplo, podemos definir en la clase Animal el método dibuja() y el método imprime(), y que Animal sea una clase abstracta o un interfaz.

Figura 2. Ejemplo de interfaz y clase abstracta


Vemos la diferencia entre clase, clase abstracta e interfaz con este esquema:

 

1.3. Conceptos Básicos de Java

 

1.3.1. Componentes de un programa Java

En un programa Java podemos distinguir varios elementos:

No tenemos que preocuparnos de liberar la memoria del objeto al dejar de utilizarlo. Esto lo hace automáticamente el garbage collector. Aún así, podemos usar el método finalize() para liberar manualmente.

 

1.3.2. Otras posibilidades

haremos que la clase MiClase1_1 pertenezca al subpaquete subpaquete1 del paquete paquete1.
Para utilizar las clases de un paquete utilizamos import:
Para importar todas las clases del paquete se utiliza el asterisco * (aunque no vayamos a usarlas todas, si utilizamos varias de ellas puede ser útil simplificar con un asterisco). Si sólo queremos importar una o algunas pocas, se pone un import por cada una, terminando el paquete con el nombre de la clase en lugar del asterisco (como pasa con Date en el ejemplo).

Al poner import podemos utilizar el nombre corto de la clase. Es decir, si ponemos:

import  java.Date;
import java.util.*;

Podemos hacer referencia a un objeto Date o a un objeto Vector (una clase del paquete java.util) con:

Date d = ...
Vector v = ...

Si no pusiéramos los import, deberíamos hacer referencia a los objetos con:

java.Date d = ...
java.util.Vector v = ...

Es decir, cada vez que queramos poner el nombre de la clase, deberíamos colocar todo el nombre, con los paquetes y subpaquetes.

 

1.3.3. Sintaxis de Java

Tipos de datos

Se tienen los siguientes tipos de datos simples. Además, se pueden crear complejos, todos los cuales serán subtipos de Object
 
Tipo
Tamaño/Formato
Descripción
Ejemplos
byte 8 bits, complemento a 2 Entero de 1 byte
210, 0x456
short 16 bits, complemento a 2 Entero corto
"
int 32 bits, complemento a 2 Entero
"
long 64 bits, complemento a 2 Entero largo
"
float 32 bits, IEEE 754 Real simple precisión
3.12,  3.2E13
double 64 bits, IEEE 754 Real doble precisión
"
char 16 bits, carácter Carácter simple
'a'
String Cadena de caracteres
"cadena"
boolean true / false verdadero / falso
true,  false

Arrays

Se definen arrays o conjuntos de elementos de forma similar a como se hace en C. Hay 2 métodos:

int a[] = new int [10];
String s[] = {"Hola", "Adios"};
No pueden crearse arrays estáticos en tiempo de compilación (int a[8];), ni rellenar un array sin definir previamente su tamaño con el operador new. La función miembro length se puede utilizar para conocer la longitud del array:
int a [][] = new int [10] [3];
a.length;        // Devolvería 10
a[0].length;     // Devolvería 3
Los arrays empiezan a numerarse desde 0, hasta el tope definido menos uno (como en C).

Identificadores

Nombran variables, funciones, clases y objetos. Comienzan por una letra, carácter de subrayado ‘_’ o símbolo ‘$’. El resto de caracteres pueden ser letras o dígitos (o ’_’). Se distinguen mayúsculas de minúsculas, y no hay longitud máxima. Las variables en Java sólo son válidas desde el punto donde se declaran hasta el final de la sentencia compuesta (las llaves) que la engloba. No se puede declarar una variable con igual nombre que una de ámbito exterior.

En Java se tiene también un término NULL, pero si bien el de C es con mayúsculas (NULL), éste es con minúsculas (null):

String a = null;
...
if (a == null)...

Referencias

En Java no existen punteros, simplemente se crea otro objeto que referencie al que queremos "apuntar". 
MiClase mc = new MiClase();
MiClase mc2 = mc;
mc2 y mc apuntan a la misma variable (al cambiar una cambiará la otra). 
MiClase mc = new MiClase();
MiClase mc2 = new MiClase();
Tendremos dos objetos apuntando a elementos diferentes en memoria.

Comentarios

// comentarios para una sola línea

/* comentarios de 
   una o más líneas */

/** comentarios de documentación para javadoc, 
    de una o más líneas */
Operadores

Se muestra una tabla con los operadores en orden de precedencia
 
Operador
Ejemplo
Descripción
.
a.length
Campo o método de objeto
[ ]
a[6]
Referencia a elemento de array
( )
(a + b)
Agrupación de operaciones
++ ,  --
a++; b--
Autoincremento / Autodecremento de 1 unidad
!, ~
!a ; ~b
Negación / Complemento
instanceof
a instanceof TipoDato
Indica si a es del tipo TipoDato
*, /, %
a*b; b/c; c%a
Multiplicación, división y resto de división entera
+, -
a+b; b-c
Suma y resta
<<, >>
a>>2; b<<1
Desplazamiento de bits a izquierda y derecha
<, >, <=, >=, ==, !=
a>b; b==c; c!=a
Comparaciones (mayor, menor, igual, distinto...)
&, |, ^
a&b; b|c
AND, OR y XOR lógicas
&&, ||
a&&b; b||c
AND y OR condicionales
?:
a?b:c
Condicional: si a entonces b , si no c
=, +=, -=, *=, /= ...
a=b; b*=c
Asignación. a += b equivale a (a = a + b)

Control de flujo

TOMA DE DECISIONES

Este tipo de sentencias definen el código que debe ejecutarse si se cumple una determinada condición. Se  dispone de sentencias if y de sentencias switch:
 
Sintaxis
Ejemplos
if (condicion1) {
   sentencias;
} else if (condicion2) {
   sentencias;
   ...
} else if(condicionN) {
   sentencias;
} else {
   sentencias;
}
if
(a == 1) {
   b++;
} else if (b == 1) {
   c++;
} else if (c == 1) {
   d++;
}
switch (condicion) {
   case caso1: sentencias;
   case caso2: sentencias;
   case casoN: sentencias;
   default:    sentencias;
}
switch (a) {
   case 1: b++;
           break;
   case 2: c++;
           break;
   default:b--;
           break;
}

BUCLES

Para repetir un conjunto de sentencias durante un determinado número de iteraciones se tienen las sentencias for, while y do...while :
 
Sintaxis
Ejemplo
for(inicio;condicion;
    incremento) 
{
  sentencias;
}
for (i=1;i<10;i++)
{
   b = b+i;
}
while (condicion){
   sentencias;
}
while (i < 10) {
   b += i;
   i++;
}
do{
   sentencias;
} while (condicion);
do {
   b += i;
   i++;
} while (i < 10);

SENTENCIAS DE RUPTURA

Se tienen las sentencias break (para terminar la ejecución de un bloque o saltar a una etiqueta), continue (para forzar una ejecución más de un bloque o saltar a una etiqueta) y return (para salir de una función devolviendo o sin devolver un valor):

public int miFuncion(int n)
{
	int i = 0;
  	while (i < n)
  	{
  		i++;
  		if (i > 10)
			// Sale del while
			break;		
  		if (i < 5)
			// Fuerza una iteracion mas
  			continue;	
  	}
	// Devuelve lo que valga i al llegar aquí  	
	return i;			
}  

 

1.3.4. Programas Básicos en Java

Veamos ahora algunos ejemplos de programas en Java.