Introducción a Java
Ubicación e historia http:// ://java.sun.com/ JDK (Java Development Kit) JDK 1.0, 1995 JDK 1.1, 1996. Modificación en manejo de eventos; nuevas bibliotecas (reflexión, métodos remotos,...) JDK 1.2, 1998. Mejora en la eficiencia de JDK 1.1, e inclusión de productos como CORBA, JFC, etc. J2SE 1.2 Java 2 Platform,, Standard Edition,, v 1.2 Implementado por Java 2 SDK, v 1.2 (Software Development Kit) J2SE 1.3.1, 2001 J2SE 1.4.0, 2002 J2SE 1.5.0 (septiembre 2004) J2SE 1.6.0 => JAVA SE 6 (2006)
Características del lenguaje Java Orientado a objetos Sintaxis familiar para C, C++ Fácil de usar (no punteros, no herencia múltiple, manejo automático de memoria) Extensible para código nativo en otros lenguajes Multiprocesos mediante uso de hilos hilos (threads) Independiente de la
Estructura del entorno JAVA Compilador de Java Visor de HTML Visor de applets de Java Intérprete de Java rograma fuente Java Programa compilado Programa ejecutado Archivo HTML INTERNET Visor de HTML
Introducción al lenguaje Java Programa fuente Ejemplo.java Compilación: : se obtiene el fichero Ejemplo.class. javac Ejemplo.java Ejecución: Intérprete (JVM) java Ejemplo ******Fichero Ejemplo.java******* class Ejemplo { } public static void main(string[] args) ) { System.out.println( Hola Mundo ); } ******************************
Aspectos léxicos Espacios en blanco no considerados Sentencias separadas por ; Comentarios // hasta final de línea /* */ más de una línea /** */ documentación 59 palabras reservadas
Aspectos léxicos (cont.) identificadores letras, números,, _, $ no empiezan con número distinción entre mayúsculas y minúsculas convenciones métodos,, variables y objetos: nextitem, lastindex(3), robotconfrontera1,robot2 clases: : Robot, RobotConFrontera constantes: : NUMERO_PI
Literales enteros base 10... base 8 0... base 16 0x... punto flotante notación estándar 3.14159 notación científica 6.022E23
Literales (cont.) booleanos true o false caracteres Unicode - 16 bits a, \n, \\,... en octal (\ddd( ddd) ) o hexadecimal (\udddd( udddd). Ejemplo: : \141, \u0061 son a (97 en decimal); \u0391 es alfa mayúscula cadenas de caracteres texto entre Hello World Java crea objeto para cada cadena
Variables Declaración tipo identificador = valor; int d = 3, e, f = 5; byte z = 22; char x = x ; Alcance desde declaración hasta final de bloque Una variable no puede tener los mismos nombres en un bloque interno dentro de un bloque externo En el bloque interno se puede llamar a la variable del bloque externo
TIPOS Java - lenguaje strongly typed tipo para cada variable y expresión asignaciones: : se comprueba compatibilidad de expresiones no hay conversiones automáticas de tipos en asignaciones (salvo que para <variable>=<expresion expresion>, el valor de <expresión< expresión> > se pueda almacenar en el hueco de memoria de <variable> y tenga sentido la asignación; por ejemplo: entre enteros y caracteres: int = char, siempre válido char = int int, válido cuando int es un literal o combinación de literales (33, 33+ a,...) asignables a 2 bytes sin signo char = short y short = char no válidos por el signo
Números enteros tienen signo byte - 8 bits byte b; byte c = 0x55; short - 16 bits short s; short t = 0x55aA;
Números enteros (cont.) int - 32 bits int i; int j = 0x1ac; long - 64 bits long m; long n=123; literal: 123L
Números reales float - 32 bits float f; float f2 = 3.14f; float f3 = 3.14; (error, 3.14 se considera double; igual con notación científica) Rango: : (+/-)3.40282347E+38f (6-7 cifras decimales significativas) double - 64 bits double d; double pi =3.14; Rango: (+/-)1.79769313486231570E+308 (15 cifras decimales significativas)
Casting almacenar valor de un tipo en variable de tipo diferente conversión automática en asignaciones si la variable destino tiene suficiente precisión y la asignación tiene sentido si no => casting (tipo)) valor int a = 100; byte b = (byte) a; En una expresión con operadores se determina el tipo de la expresión 34, -45, 5667 tipo int 34.34, -234.45 tipo double
Ejemplo class Promote { public static void main(string[] args) ) { byte b = 42; char c = a ; short s = 1024; int i = 50000; float f = 5.67f; double d =.1234; double result = (f * b) + (i / c) - (d *s); System.out.println((f * b) + + + (i / c) + - + (d *s)); System.out.println( result = + result); } }
Caracteres char - 16 bits Unicode char c2 = 0xf132; char c3 = a ; pueden operarse como enteros int three = 3; char one = 1 ; char four = (char) (three + one); (el tipo estático,es decir en tiempo de compilación,, de una suma de char, byte, int,,... es siempre int)
Tipo booleano boolean boolean done = false; true o false tipo devuelto por op.. de comparación requerido por op.. de control
Arrays declaración int diasdemeses[]; int[] diasdemeses; asignar espacio diasdemeses = new int[12]; Tamaño puede ser una expresion a evaluar diasdemeses.length" obtiene el tamaño dar valor diasdemeses[0] = 31;... diasdemeses[11] = 31;
Arrays (cont.) otra forma (los( valores pueden ser expresiones a evaluar). Dos modos: 1) En declaración de tipo int[] diasdemeses = {(x+1),28,...,31}; 2) En cualquier lugar: int[] diasdemeses; diasdemeses = new int[]{31,(27+1),...,31}; error de ejecución si intentamos acceder a elementos fuera de rango Toman valores por defecto (variables numéricas a 0 y objetos a null) main String[] args System.out.println(args[0]);
Arrays multidimensionales double[][] matriz =new double[4][4]; o double[][] matriz = new double[4][]; // hace falta la primera dimension matriz[0] = new double[4]; matriz[1] = new double[4]; matriz[2] = new double[4]; double x[] = {1, 2, 3, 4}; matriz[3] = x;
Operadores aritméticos +, -,, *, /, % (la division de enteros es entero) asignación aritmética += -= *= /= %= a += 4; (equivale a a = a + 4;) incremento y decremento x = x+1; x+=1; ++x; x++; x = x-1; x x-=1; x --x; x--; se modifica el operando en ambos casos prefija: : 1º se modifica, después se asigna postfija: : 1º se asigna, después se modifica
Ejemplo class IncDec { public static void main(string[] args) ) { int a = 1; int b = 2; int c = ++b; int d = a++; c++; System.out.println( a = + a); a = 2 System.out.println( b = + b); b = 3 System.out.println( c = + c); c = 4 System.out.println( d = + d); d = 1 }}
Operadores de bit; operador de asignación Operadores de bit son aplicables a tipos enteros: NOT ( ~) AND (&) OR ( ) XOR (^) desplazamiento izquierda (<<) desplazamiento derecha (>>) Asignación: <variable>=<expresion expresion> Es legal cuando el tipo de <expresion> > es un subtipo del tipo de
Operadores lógicos ==,!= aplicables a cualquier par de tipos <, >, >=, <= && & aplicables a números AND lógico AND lógico evalua todos los operandos OR lógico OR lógico! evalua todos los operandos NOT lógico
Operadores lógicos (cont.) Operador ternario if-then then- else expresión? sentencia1 : sentencia2 sentencia1 y sentencia2 deben devolver el mismo tipo radio = (denom( == 0)? 0 : num / denom;
Precedencia de operadores postfijos: []. (params( params) expr++ expr-- prefijos: ++expr --expr +expr -expr ~! Creación, casting: new (type)expr multiplicativos: * / % aditivos: + - desplazamiento: << >> relacionales: < > <= >= instanceof igualdad: ==!= bitwise AND: & bitwise exclusive OR: ^ bitwise inclusive OR: lógico AND: && lógico OR: condicional:? : asignación: = += -= = *= /= %= &= ^= = <<= >>=
OPERADORES DE if-else CONTROL if (expr( expr-booleana) sent1 ; [else sent2;] else - opcional sentencias pueden ser compuestas expr-booleana - expr con valor booleano
if-else (cont.) lass IfElse { public static void main(string[] args) ) { int month = 4; String season; if (month == 12 month == 1 month == 2) { season = Winter ; } else if (month == 3 month == 4 month == 5) { season = Spring ; } else if (month == 6 month == 7 month == 8) { season = Summer ; } else if (month == 9 month == 10 month == 11) { season = Autumn ; } else { season = Error ; } System.out.println( April is in the + season +. ); } }
switch switch (expresión)) { case value1:... break;... case valuen:... break; default:... } - expresion debe ser de tipo byte, short, int,, char o tipo enumerado - value1,.. value deben ser literales - Cuando un literal coincide con expresion, ya no se comprueban más cases y se ejecutan todas las instrucciones restantes (excepto los cases ), por lo que hay que utilizar break
switch (cont.) class SwitchSeason { public static void main(string[] args) ) { int month = 4; String season; switch (month) { case 12: case 1: case 2: season = Winter ; break; case 3: case 4: case 5: season = Spring ; break;... default: season = Error ; } } }
while, do-while Sintaxis: : while (<condición condición>) <sentencia< sentencia> do <sentencia< sentencia> > while (<condición condición>); class WhileDemo { public static void main(string[] args) ) { int n = 10; while (n > 0) { System.out.println( tick + n); n--; } } } class DoWhile { public static void main(string[] args) ) { int n = 10; do { System.out.println( tick + n); } while (--( --n n > 0); } }
for for ([inicialización];[condición];[iteración inicialización];[condición];[iteración]) ]) <sentencia> Ejemplos de inicialización: int x=3, y=7 x=3, y=7 Ejemplos de iteración: b-- b--,, c++ Al principio,, [inicialización[ inicialización] -> > [condición[ condición] en adelante [iteración] -> > [condición[ condición] class ForDemo { public static void main(string[] args) ) { for (int( a = 1, b = 4; a < b; a++, b--b --)) { System.out.println( a = + a); System.out.println( b = + b); } } }
Nuevo for Desde versión 1.5 int[] numeros ={3,4,5}; for (int j : numeros) System.out.println(j); Uso también en colecciones con iteradores
continue, return continue se puede utilizar dentro de un bucle para ir directamente a ejecutar la línea que contiene la condicion break saca de un bucle return acaba la ejecución de una función class ContinueDemo { public static void main(string[] args) ) { for (int( = 0; i < 10; i++) { System.out.print(i + ); if (i % 3 == 0) continue; System.out.println( ); } } } class ReturnDemo { public static void main(string[] args) ) { System.out.println( Esto se ejecuta ); return; System.out.println( Esto no se ejecuta ); } }
Funciones globales Se puede reproducir el estilo de programación en un lenguaje como C mediante la definición de funciones static (en una o varias clases). Uso de paquetes para dividir las clases en directorios.
Uso de un classpath classpath, I Un classpath classpath es un conjunto de: Directorios Ficheros comprimidos ( archive files, de extensiones.zip,.jar, ) conteniendo clases. Son una especie de directorios La compilación o ejecución se realiza con respecto a un classpath Una clase siempre debe ser accesible (usando import o bien llamandola directamente) a través del classpath. Podría: Estar en un directorio de la forma: un-directorio directorio-del-classpath + \dir1\dir2\
Uso de un classpath, II Una clase siempre se define en un paquete. Ejemplo: **********Fichero Ejemplo.java********* package dir1.dir2; class Ejemplo { public static void main(string[] args) ) { System.out.println( Hola Mundo ); } } ************************************ Si no se especifica package, se supone incluida en el default package
Uso de un classpath classpath, III En IDEs: p.ej. NetBeans 5.0: Para cada proyecto: Directorio del proyecto (D1) Nombre del proyecto (directorio D2, que es subdirectorio de D1) Clase con el método main (por( ejemplo dir1.dir2.ejemplo, que crea el fichero D1/D2/src/dir1/dir2/Ejemplo.java ) Al compilar,, se genera: D1/D2/build/clases/dir1/dir2/Ejem plo.class El classpath utilizado es: Compilación: : D1/D2/src Ejecución: : D1/D2/build/classes
Uso de un classpath classpath, I El valor de un classpath puede ser el de la variable de entorno CLASSPATH. Por ejemplo,, en DOS: set CLASSPATH=.;c:\ejemplo1 ejemplo1\clases.zip;c: clases.zip;c:\ejeeje mplo2\clases clases\ set CLASSPATH=%CLASSPATH%;c: CLASSPATH%;c:\directorio\ en Linux: export CLASSPATH=.:/usr/lib/antlr.jar
Uso de un classpath, III Un classpath se utiliza, por ejemplo, para compilar y ejecutar con javac y java. Ejemplos en DOS/LINUX: Uso de la variable de entorno CLASSPATH (si( no está definida,, el classpath es. ) javac programas\sencillos sencillos\ejemplo.java javac programas/sencillos/ejemplo.java java programas.sencillos.ejemplo java programas.sencillos.ejemplo javac classpath c:\;c: ;c:\java Ejemplo.java Javac classpath.:./java Ejemplo.java Usa como classpath c: c:\;c: ;c:\java,.:./java El fichero Ejemplo.java podría estar, por ejemplo,, en el directorio c: c:\java\programas\sencillos\, /java/programas/sencillos programas/sencillos Cada fichero.java, usualmente, contendrá una sóla clase que se llamará igual que el fichero. La restricción es que si un fichero.java contiene muchas clases, sólo una puede ser pública y, en tal caso, el fichero se debe llamar obligatoriamente igual que la clase pública.