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).
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
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
En un programa Java podemos distinguir varios elementos:
import java.util.*;
public class MiClase { ...
public int a; Vector v;
public void imprimirA() public void insertarVector(String cadena)
public MiClase()
Así, podemos definir una instancia con new:
MiClase mc; mc = new MiClase (); mc.a++; mc.insertarVector("hola");
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.
class Pato extends Animal
public class MiClase { int i; public MiClase (int i) { this.i = i; // i de la clase = parametro i } }
public class MiNuevaClase extends MiClase { public void Suma_a_i (int j) { i = i + (j / 2); super.Suma_a_i (j); } }
public interface Animal { void dibujar (); void imprimir (); } |
public class Pato implements Animal { void dibujar() { codigo; } void imprimir() { codigo; } } |
public abstract class Animal { abstract void dibujar (); void imprimir () { codigo; } } |
public class Pato extends Animal { void dibujar() { codigo; } } |
package paquete1.subpaquete1; public class MiClase1_1 ...
haremos que la clase MiClase1_1 pertenezca al subpaquete subpaquete1 del paquete paquete1.
Para utilizar las clases de un paquete utilizamos import:
import java.Date; import paquete1.subpaquete1.*; import java.awt.*;
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.
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 3Los 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 */OperadoresSe 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; }
Veamos ahora algunos ejemplos de programas en Java.