Curso de Programación JAVA

Fco. Javier Alcalá Casado

Contenidos
ð Bibliografía ð Introducción ð Características de Java ð Tipos de datos y operadores ð Control de flujo ð Programación orientada a objetos ð Arrays ð Características avanzadas de la orientación a objetos ð Características avanzadas del lenguaje ð Excepciones ð Entrada/salida ð Clases útiles ð Threads

Bibliografía
ð Java in a nutshell: a desktop quick reference D. Flanagan. Ed. O’Reilly Muy completo ð The Java tutorial: object-oriented programming for the Internet M. Campione. Ed. Addison-Wesly Programación del lenguaje ð Core packages. J. Gosling. Ed. Addison-Wesley Manual de referencia ð The Java language specification J. Gosling. Ed. Addison-Wesley Lenguaje y manual de referencia ð http://java.sun.com/j2se/1.4/docs/api/index.html Referencia actualizada por SUN Microsystems

Introducción

Fco. Javier Alcalá Casado

Introducción (I)
ð Creado en 1991 por Sun Microsystems para electrodomésticos:
û Escasa potencia de cálculo û Poca memoria û Distintas CPUs

ð Consecuencias:
û Lenguaje sencillo que genera código reducido û Código neutro independiente de la CPU (máquina virtual)

ð Lenguaje de programación para ordenadores desde 1995

Introducción (II)
ð Sun describe Java como un lenguaje “simple, orientado a objetos, distribuido, interpretado, robusto, seguro, de arquitectura neutra, portable, de altas prestaciones, multitarea y dinámico” ð Similar en sintaxis a C/C++ y en semántica a SmallTalk ð Ejecución de Java como:
û aplicación independiente û applet (dentro del navegador al cargar la página web) û servlet (ejecutado en servidor de Internet, sin interfaz gráfica)

ð JDK (Java Development Kit): programas y librerías para desarrollar, compilar y ejecutar programas Java

Contiene: û Conjunto de instrucciones m áquina (C.O..Características de Java ð Lenguaje de fácil uso orientado a objetos ð Lenguaje compilado e interpretado ð Facilita un entorno interpretado: û Velocidad de desarrollo (no de ejecución) û Portabilidad del código ð Ejecución multitarea ð Cambios dinámicos en tiempo de ejecución ð Seguridad del código Máquina Virtual Java (JVM) ð La Java Virtual Machine es una máquina hipotética que emula por software a una máquina real.. + Operandos) û Registros û Pila û Memoria û . ð El compilador genera bytecodes (instrucciones de código máquina para JVM) ð El intérprete ejecuta y traduce los bytecodes para cada máquina específica .

.class) ð Aplicación con argumentos: > java Nombre arg1 arg2 .Compilador e Intérprete de Java ð El compilador analiza la sintaxis del código fuente (con extensión *.java ⇒ Nombre.class) creados por el compilador > java Nombre (sin extensión . Si no hay errores. esta liberación debe realizarla el propio programador ð La JVM dispone de un thread que rastrea las operaciones de memoria: el Garbage Collector. genera bytecodes > javac Nombre.class ð El intérprete es la Máquina Virtual Java que ejecuta los bytecodes (con extensión *.java).. Garbage Collector ð Debe liberarse la memoria reservada dinámicamente que no se vaya a utilizar más ð En otros lenguajes. el cual: û Verifica y libera la memoria que no se necesita û Se ejecuta automáticamente û Puede variar según la implementación de la JVM .

es necesario incluir las siguientes líneas al final del autoexec.C:\jdk1.Seguridad del Código ð La JVM verifica los bytecodes asegurando que: û el código se ajusta a las especificaciones de la JVM û no hay violaciones de acceso restringido û el código no provoca desbordamientos de la pila û los tipos de los parámetros son correctos para todo el código û no existen conversiones ilegales de datos (p.e.2.bat ð Para tener accesibles el compilador y el intérprete Java: set PATH=%PATH%.. convertir de enteros a punteros) û los accesos a los campos de los objetos están autorizados Variables de entorno ð En versiones antiguas del JDK.%CLASSPATH% .2\bin (el directorio dependerá de dónde se hayan instalado las JDK) ð Para acceder a las clases desarrolladas por uno mismo: set CLASSPATH=.

java > java HolaMundo ¡Hola Mundo! .. } } > javac HolaMundo.out.*.println(“¡Hola Mundo!”). import java.Formato de los Ficheros Fuente ð El fichero fuente contiene 3 elementos principales: û Declaración de paquete (opcional) û Sentencias de importación (opcional) û Declaración de clase o de interfaz Ejemplo: fichero fuente Empleado.*.awt. } “¡Hola Mundo!” Fichero HolaMundo.lang. import java.financedept.java package abc..java: 1 2 3 4 5 6 7 8 9 10 // // Aplicación ejemplo HolaMundo // public class HolaMundo { public static void main (String args[]) { System. public class Empleado { .

Características de Java

Fco. Javier Alcalá Casado

Características del Lenguaje
ð Sensible a mayúsculas/minúsculas ð Soporta comentarios ð Lenguaje de formato libre ð Permite identificadores ð Incluye palabras reservadas ð Permite variables y constantes ð Convenciones de nomenclatura ð Tiene reglas sobre los tipos de datos

Sensible a Mayúsculas/Minúsculas
ð Se distingue entre mayúsculas y minúsculas ð Los identificadores Cat, cat y CAT son diferentes ð Todas las palabras reservadas del lenguaje van en minúsculas

Soporta Comentarios
ð Existen tres formas de introducir comentarios:
û Comentario en una línea // Comentario de una línea û Comentario en una o más líneas /* Comentario de más de una línea */ û Comentario de documentación. Se usa con javadoc /** Método XYZ: Realiza la labor X sobre los datos Y devolviendo Z */
> javadoc Fichero.java ⇒ Fichero.html

Lenguaje de Formato Libre
ð La disposición de los elementos dentro del código es libre ð Sentencias: línea simple de código terminada en ;
total = a + b + c + d ;

ð Bloque de código: conjunto de sentencias agrupadas entre llaves
{ x=x+1; y=y+1; }

ð Java permite espacios en blanco entre elementos del código
x1 = y * delta ; x2 = (y+1) * delta ;

Identificadores
ð Son nombres de clases, variables o métodos ð No tienen longitud máxima ð El primer carácter del identificador debe ser: A-Z, a-z, _, $ ð El resto: A-Z, a-z, _, $, 0 -9 ð No se permiten vocales acentuadas ni la letra e ñe (ñ, Ñ) ð No se permite utilizar palabras reservadas como identificador

ð Constantes: zona de memoria cuyos valores no cambian Declaración: final <tipo> <identificador> = <valor> . ó <tipo> <identificador> .Palabras Reservadas ð Palabras con un significado especial para el compilador: abstract boolean break byte case catch char class const1 continue 1 default do double else extends false2 final finally float for goto 1 if implements import instanceof int interface long native new null2 package private protected public return short static super switch synchronized this throw throws transient true2 try void volatile while palabras no usadas por el lenguaje.. Ejemplo: final double PI = 3. <identificador> . z . pero son reservadas 2 realmente son constantes del lenguaje Variables y Constantes ð Variables: zona de memoria cuyos valores van a cambiar durante la ejecución Declaración: <tipo> <identificador> .. Ejemplo: int x. .14159265 . . y.

ANCHO_IMAGEN . una variable. String û Variables: primera letra en minúscula y la primera letra de cada palabra en mayúscula Ejemplo: contador.Asignación de Variables ð Se utiliza el operador asignación = <variable> = <expresión> . string û Constantes: todo en mayúsculas. Convenciones de Nomenclatura (I) ð Los identificadores que proporciona Java siguen una convención según el elemento: û Clases: primera letra en mayúscula de cada palabra Ejemplo: Empleado. numeroTotalAccesos. separando cada palabra por el carácter “_” Ejemplo: PI. ð La parte izquierda siempre debe ser una variable ð La parte derecha puede ser un literal. una función o una combinación de todos ð Se puede asignar un valor a una variable en el momento de declararla Ejemplo: int i = 0 . una expresión. LibroDeCuentas.

obtenerResultado() û Estructuras de control: utilizar llaves englobando a todas las sentencias de una estructura de control. Javier Alcalá Casado .Convenciones de Nomenclatura (II) û Métodos: siguen el mismo formato que las variables seguidas de paréntesis “(“ “)” Ejemplo: sumar(). aunque sólo haya una sentencia Ejemplo: if ( <condición> ) { // hacer algo } else { // hacer otra cosa } Tipos de Datos y Operadores Fco.

. if ( i != 0 ) { .Tipos de Datos ð Java define dos tipos de datos: û Tipos primitivos û Tipos referencia ð Los tipos primitivos son ocho agrupados en cuatro categorías: û lógico: boolean û texto: char û entero: byte. short. } Error de compilación int i = 10 .. double ð Los tipos referencia son punteros a objetos Tipo de Datos Lógico ð El tipo de datos boolean (8 bits) puede tomar dos valores posibles: true y false ð El tipo boolean no toma valores numéricos ð En Java no se considera cero como falso y distinto de cero como verdadero (como sucede en C/C++) ð No existe conversión entre tipos enteros y tipos lógicos int i = 10 . if ( i ) { . long û real: float. } Correcto .. int..

chino. 0xCC00 (empezando con 0x) ð Por defecto siempre se consideran de tipo int ð Seguido de L se considera long: 156L.) ð El literal de texto debe ir entre comillas simples ‘ ’ ð Utiliza la siguiente notación: û caracteres simples: ‘a’ û caracteres especiales: ‘\t’.. 56453645 û octal: 077. ‘\n’ û caracteres Unicode (con 4 dígitos en hexadecimal): ‘\u00BF’ Tipo de Datos Entero ð Existen cuatro tipos de datos enteros: byte (8 bits).Tipo de Datos de Texto ð El tipo char (16 bits) representa sólo un carácter Unicode ð El código universal Unicode incluye el código ASCII y comprende los caracteres gráficos de prácticamente todos los idiomas (japonés. short (16 bits). 07700 (empezando con un cero) û hexadecimal: 0xABFF. 0xABFFL . 156. int (32 bits) y long (64 bits) ð Todos los tipos tienen signo. 077L.. El cero se considera positivo ð Los literales enteros se pueden representar con notación: û decimal: 2. braille.

2. si no se indica explícitamente que es un float Resumen de Tipos Primitivos ð El tamaño de cada tipo de dato primitivo se mantiene invariable.0 Tamaño Min 8 bits 16 bits 8 bits 16 bits 32 bits 64 bits 32 bits 64 bits \u0000 -128 -32768 -2147483648 -9223372036854775808 ±3.40239846E-45 ±4.05E27 û una F ó f (float): 279F.40282347E+38 ±1.94065645841246544E-324 .79769313486231570E+308 Rango de valores Max \uFFFF 127 32768 2147483647 9223372036854775808 ±1.Tipo de Datos Real ð Existen dos tipos de datos reales: float (32 bits) y double (64 bits) ð Un literal es de punto flotante si lleva: û un punto decimal: 3. 2.79f û una D ó d (double ): 279D. independientemente de la arquitectura de la máquina ð El valor por defecto se toma para las variables no inicializadas de los objetos Tipo boolean char byte short int long float double Contiene True o false Carácter Unicode Entero con signo Entero con signo Entero con signo Entero con signo IEEE 754 estándar punto flotante IEEE 754 estándar punto flotante Valor por defecto false \u0000 0 0 0 0 0.14159.0 0. 1.79d ð Un literal real por defecto siempre se considera de tipo double. 2.0 û una E ó e (valor exponencial): 105e25.

Usuario user . ⇒ Error de compilación sun = pc . sun . user = pc . ⇒ Correcto ð Todas las clases son de tipo referencia ð El valor que toma por defecto una variable de tipo referencia es null Cadenas de Caracteres ð La clase String permite manejar cadenas de caracteres ð El literal String debe ir entre comillas dobles “ ” ð Se puede crear una cadena de caracteres de dos formas: String nombre = new String(“Pepe”). String nombre = “Pepe”. pc = new Ordenador ( ) . ð “a” ≠ ‘a’ ð Para concatenar dos cadenas se utiliza el operador + “Pepe” + “Pérez” ⇒ “PepePérez” ð No se guarda el carácter de fin de cadena .Tipo de Datos Referencia ð Un tipo referencia guarda un puntero a la dirección donde se ubica el objeto (32 bits) ð Sólo puede almacenar direcciones de objetos de su propio tipo Ejemplo: Ordenador pc .

String cadena . b . pc cadena reunion ???? 32 bits ???? 32 bits ???? Conversión de Tipos ð La conversión de tipos (casting) se debe realizar entre tipos de la misma naturaleza: numéricos o referencia ð Al convertir un tipo a un tamaño más peque ño se puede perder la información de los bits de mayor peso ð La sintaxis es: (<tipo>) <expresión> Ejemplo: byte num8bits = (byte) 27 . c . c = a + b .Memoria Asignada a una Variable ð Tipo primitivo: se asigna la cantidad de memoria que requiere el tipo de la variable 64 bits Ejemplo: long x . + devuelve int c = (short)(b + c) . Ejemplo: short a . Fecha reunion . int num32bits = 27 . num8bits = (byte) num32bits . ⇒ Error. x ???? ð Tipo referencia : se asigna el espacio correspondiente a una dirección de memoria (32 bits) 32 bits Ejemplo: Computer pc . ⇒ Correcto .

+=. <. >. i=7 . || (OR). %= <var> += <expr> ⇒ <var> = <var> + <expr> ð Operadores incrementales: ++. *=. j=i. i=i+1. -. /. -û precediendo a la variable: ++<var>. | (OR) û && y || realizan evaluación perezosa: Ÿ op1 && op2 ⇒ si op1 es false. -=. j=i. j=++i. ! (NOT). <= ð Operadores lógicos: && (AND). no se evalúa op2 Ÿ op1 || op2 ⇒ si op1 es true. i=7 . j=7 Operadores Java (II) ð Operadores relacionales: == (igual). no se evalúa op2 û & y | siempre evalúan los dos operadores ð Operador instanceof: <objeto> instanceof <clase> determina si un objeto pertenece a una clase . --<var> û siguiendo a la variable: <var>++. i=6. & (AND). != (distinto). >=. ⇒ i=i+1. j=i++. ð Operadores aritméticos: +.Operadores Java (I) ð Operadores unarios: +. j=6 ⇒ i=6. /=. *. i=6. <var>-i=6. % (resto de la división) ð Operadores de asignación: =.

<<. ^. excepto los operadores de asignación Tipo Operadores sufijos Operadores unarios C r e a c i ó n y casting Multiplicativos Aditivos Desplazamiento Relacional Igualdad AND (bits) OR exclusivo (bits) OR inclusivo (bits) AND lógico OR lógico Condicional Asignación Operador [] . &. >>>. |. ~ û op1 >> n û op1 << n desplaza los bits de op1 (con signo) a la derecha n posiciones desplaza los bits de op1 (con signo) a la izquierda n posiciones û op1 >>> n desplaza los bits de op1 (sin signo) a la derecha n posiciones û op1 & op2 Operador AND a nivel de bits û op1 | op2 Operador OR a nivel de bits û op1 ^ op2 Operador XOR a nivel de bits û ~op1 Operador complemento (NOT a nivel de bits) Precedencia de Operadores ð Todos los operadores binarios se evalúan de izquierda a derecha.Operadores Java (III) ð Operador condicional: ? : <exprBooleana> ? <valor1> : <valor2> Permite bifurcaciones condicionales sencillas ð Operadores a nivel de bits: >>. (argumentos) e x p r + + expr-++expr – expr +expr –expr ~ ! new (tipo)expr * / % + << >> >>> < > < = > = instanceof == != & ^ | && || ?: = += -= *= /= %= & = ^ = | = < < = > > = > > > = .

while. Javier Alcalá Casado Control de Flujo ð Las sentencias de control del flujo de ejecución permiten tomar decisiones y realizar un proceso repetidas veces ð Hay dos tipos principales de sentencias de control de flujo: û Condicionales: if.Control de Flujo Fco. switch û Bucles: for. do while ð Otras sentencias que permiten interrumpir el flujo normal de ejecución son break y continue .

] [break. } Sentencia switch ð Comparación de igualdad múltiple con la misma variable switch ( <variable> ) { case literal1: [<grupoSentencias1> .] case literal2: [<grupoSentencias2> . } ð if ( <exprBooleana> ) { <grupoSentencias1> .. } ð if ( <exprBooleana1> ) { <grupoSentencias1> .] . } else if ( <exprBoolean2> ) { <grupoSentencias2> . } else { <grupoSentencias3> . case literalN: [<grupoSentenciasN> .] [default: <grupoSentencias> .Sentencia if ð Ejecuta un conjunto de sentencias en función del valor de la expresión de comparación (booleana) ð if ( <exprBooleana> ) <sentencia> . } else { <grupoSentencias2> .] [break.] } ..] [break. ð if ( <exprBooleana> ) { <grupoSentencias> .

} û <inicialización> asignación del valor inicial de las variables que intervienen en la expresión û <exprBooleana> condición booleana û <actualización> nuevo valor de las variables û en <inicialización> y en <actualización> pueden ir más de una asignación separadas por comas .Abrir Fichero 2.Ejemplo switch Opciones de un menú: 1. <actual> ) { <grupoSentencias> .Imprimir Datos 5..Cerrar Fichero 3. <exprBooleana>. break . case 4: imprimirDatos ( ) .Salir switch ( opcion ) { case 1: abrirFich ( ) . break . case 2: cerrarFich ( ) .Cerrar Fichero e Imprimir Datos 4. } Sentencia for ð Permite la ejecución repetida de un grupo de sentencias con mayor control for ( <inicial>. break .. case 3: cerrarFich ( ) .. case 5: default: terminarPrograma ( ) ...

println ( i + “. j=100 . Sentencia while ð El grupo de sentencias se ejecuta mientras se cumpla la expresión booleana while ( <exprBooleana> ) { <grupoSentencias> . i++ .” + j ) . i < j . } . Ejemplo: for ( i=0 .out. j -= 3 ) System.Funcionamiento de la sentencia for ð Las partes del for siguen el siguiente orden de ejecución: <inicialización> <exprBooleana>) V <grupoSentencias> F <actualización> <siguienteSentencia> .

} Sentencia do while ð El grupo de sentencias se ejecuta mientras se cumpla la expresión booleana do { <grupoSentencias> .while for ( <inicial>.Equivalencia for . ð El grupo de sentencias se ejecuta al menos 1 vez . <exprBooleana>. } equivale a <inicialización> . <actual> ) { <grupoSentencias> . while ( <exprBooleana> ) { <grupoSentencias> . } while ( <exprBooleana> ) . <actualización> .

Javier Alcalá Casado . while y do while Programación Orientada a Objetos (POO) Fco. while. do while y switch ð La sentencia continue provoca la terminación inmediata de una iteración de un bucle Válido para for.Sentencias break y continue ð La sentencia break provoca la terminación inmediata de un bucle o sentencia switch (sin ejecutar el resto de sentencias) Válido para for.

así hasta que se produce el valor deseado ð Paradigma orientado a objetos: los datos se consideran la parte más importante del programa. de modo que se agrupan en objetos.Paradigmas de Programación ð Paradigma estructurado o procedural: los programas se dividen en procedimientos independientes con acceso total a los datos comunes Algoritmos + Estructuras de Datos = Programas ð Paradigma funcional: el resultado de un cálculo es la entrada del siguiente. Los objetos modelan las características de los problemas del mundo real. su comportamiento ante estas características y su forma de interactuar con otros elementos Objetos + Mensajes = Programas Ejemplo ð Tomarse un café en una cafetería: ð Procedural: û el cliente entra en la cafetería û el cliente pasa detrás de la barra û el cliente prepara la cafetera û el cliente se sirve el café û el cliente se bebe el café ð Orientado a objetos: û el cliente entra en la cafetería û el cliente pide un café al camarero û el camarero prepara la cafetera û la cafetera hace el café û el camarero sirve el café al cliente û el cliente se bebe el café .

. Pueden ser variables numéricas o referencias a otros objetos û Métodos: comportamiento de los objetos. Son funciones que operan sobre los atributos de los objetos CLASE Atributos Métodos Características de la Orientación a Objetos ð Cada objeto tiene características reconocibles Ejemplo: un Empleado tiene Nombre.Conceptos de la Orientación a Objetos ð Clases: patrones que indican cómo construir los objetos ð Objetos: instancias de las clases en tiempo de ejecución Ejemplo: plano de arquitecto vs edificios ð Miembros de la clase: û Atributos: características o propiedades de los objetos. el programa crea objetos a partir de cada clase ð Los objetos almacenan información ð Los objetos realizan operaciones sobre sus atributos .000 € ð El código fuente orientado a objetos define clases ð En tiempo de ejecución. DNI. ð Cada objeto es único Ejemplo: el Empleado1 es Pepe Pérez con DNI 12345678 cobra 18.. Salario.

. } } Definición de Clase ð Sintaxis: class <NombreClase> { // Declaración de atributos <tipo> <variable> .saluda(). } } ð El nombre del fichero Java debe coincidir con el de la clase definida en él ⇒ <NombreClase>. // Declaración de métodos <tipo> <nombreMétodo> ( <argumentos> ) { . obj.out.. } } Fichero fuente Objeto.Mínimo Programa Orientado a Objetos Fichero fuente MinProgOO.java ð Se recomienda definir una clase por cada fichero Java .println(“¡Hola Mundo!”).java: public class Objeto { public void saluda() { System.java: public class MinProgOO { public static void main (String args[]) { Objeto obj = new Objeto().

... int anno .java class Fecha { // Atributos int dia . reunion = new Fecha ( ) .} } Creación de un Objeto ð Se utiliza la palabra reservada new <refObjeto> = new <NombreClase>() .} String darFormato ( ) {. // Métodos void asignarDia ( int d ) {. int mes . 32 bits 32 bits reunion ???? reunion 0xFFFF0000 dia mes anno 0 0 0 .Ejemplo de Clase ð Clase que almacena una fecha ⇒ Fecha. ð Ejemplo: Fecha reunion ..

<método>() Ejemplo: Fecha reunion = new Fecha ( ) .darFormato() . Métodos ð Los métodos son bloques de código (subprogramas) definidos dentro de una clase ð Un método tiene acceso a todos los atributos de su clase ð Pueden ser llamados o invocados desde cualquier sitio ð Un método puede invocar a otros métodos ð Los métodos que se invocan a sí mismos son recursivos ð En Java no se puede definir un método dentro de otro ð La ejecución de todos los programas se inician con el método main .anno = 2000 .) se puede acceder tanto a los atributos como a los métodos <refObjeto>.dia = 15 .Acceso a los Miembros de un Objeto ð A través del operador punto (. reunion.mes = 12 . reunion.<atributo> ó <refObjeto>. reunion. reunion.

debe utilizar la sentencia return return <valor> .]] Definición de Métodos (II) ð <bloqueCódigo>: conjunto de sentencias que implementan la tarea que debe realizar el método Si devuelve un valor. <valor> debe ser del mismo <tipoRetorno> con que se ha declarado el método El código se ejecuta hasta alcanzar la sentencia return (si devuelve un valor) o hasta el final del método (si no devuelve nada) Se pueden declarar variables locales si son necesarias .Definición de Métodos (I) <tipoRetorno> <nombreMétodo> ( <listaArgumentos> ) { <bloqueCódigo> } ð <tipoRetorno>: tipo de dato que retorna el método (primitivo o referencia) Si no devuelve ning ún valor... <tipo> <argumento>. debe ser void ð <nombreMétodo>: identificador del método ð <listaArgumentos>: el método admite que le pasen argumentos separados por comas con el formato: [<tipo> <argumento> [.

Ejemplos de Métodos ð double tangente ( double x ) { return Math.sin(x) / Math. int mes . pero el contenido del objeto referenciado sí se puede cambiar dentro del método ð Tipo primitivo Tipo referencia ⇒ ⇒ paso por valor paso por referencia . s = dia + “/” + mes + “/” + anno . return s . } ð String darFormato ( int dia .println ( “Hola” ) . } Paso de Argumentos ð Java sólo permite pasar argumentos por valor ð El método recibe una copia de los argumentos ð El valor de los argumentos de tipo primitivo no cambia fuera del método ð El valor de los argumentos de tipo referencia (un puntero a un objeto) tampoco cambia fuera del método.out. } ð void imprimirHola ( ) { System.cos(x) . int anno ) { String s .

.. .x ..x). sólo se accede a la variable del método class A { int x . obj. obj.println(obj.. si coincide el identificador de un argumento o variable local con el de una variable miembro. void metodo ( int y ) { int z . main(.. A obj = new A().. ⇒ 8 } } .println(y). x = y + z .) { int arg = 4 . Dejan de existir al finalizar el método ð Dentro de un método. void metodo ( int y ) { int x = 2 .Ámbito de las Variables (I) ð En Java se dispone de tres tipos de variables: û Variables miembro pertenecientes a una clase û Argumentos de un método de la clase û Variables locales de un método de la clase ð Los argumentos trabajan como variables locales class Ejemplo { int x .. .println(arg). ⇒ 1 } . y = 3*x + y . } } // variable miembro // argumento // variable local Ámbito de las Variables (II) ð Las variables miembro son visibles desde cualquier parte de la clase ð Los argumentos y variables locales sólo son visibles dentro del método al que pertenecen..x = 1 .metodo(arg). ⇒4 ...

y = 3*this.El puntero this ð Se emplea para apuntar al objeto actual dentro de un método ð Con this se hace accesible una variable miembro cuyo identificador coincide con una variable local class A { int x ... siempre que se pueda identificar cada método ð Un método se identifica por su nombre.println(obj.x).x = 1 . .x .. ⇒ 5 } } . void metodo ( int y ) { int x = 2 . el tipo de retorno.. ⇒ 4 .x + y .. main(..metodo(arg).) { int arg = 4 .println(arg). obj.. ....⇒ 1 } Sobrecarga de Métodos ð A veces se necesitan varios métodos que hagan la misma tarea pero con argumentos de tipos distintos ð Java permite utilizar un mismo nombre para diferentes métodos. el número de argumentos que tiene y el tipo de cada uno de ellos void mostrarInt(int i) void mostrarLong(long l) void mostrarFloat(float f) void mostrar(int i) void mostrar(long l) void mostrar(float f) ð Esta característica se llama sobrecarga de métodos . obj. A obj = new A().println(y).

Java proporciona uno por defecto. 2000 ) .. 12. public Fecha ( ) {.} public Fecha ( int d....Constructores (I) ð Un constructor es un tipo especial de método que permite construir un objeto de una clase Ejemplo: class Fecha { Tienen el mismo nombre que la clase . Constructores (II) ð Los constructores se pueden sobrecargar y son opcionales ð Si no se define ning ún constructor.. Incorpora el siguiente código a la clase: class <NombreClase> { ... en el constructor se inicializan las variables miembro . int a ) {. } No definen tipo de retorno ð Se utilizan junto con la palabra reservada new Fecha f = new Fecha ( 10. se pierde el constructor por defecto ð Normalmente.} . public <NombreClase> ( ) { } . int m... } ð Si se define un constructor con argumentos....

Javier Alcalá Casado .Destructores ð En Java no hay destructores de objetos como en C++ ð El garbage collector es el encargado de liberar la memoria: û Cuando detecta objetos no referenciados û Al final de un bloque que haya utilizado objetos Arrays Fco.

(a. int[] a. int a[]. a[0] = 15. b y c son arrays) ⇒ RECOMENDADO Instanciación de Arrays ð Creación de objetos array: <variable> = new <tipo> [<tamaño>].out. (a es un array.out. ð Al crear el objeto.println(i). el número de elementos (<tamaño>) se guarda en un atributo llamado length ð El primer elemento del array está en la posición 0 y el último. [ ]. equivale a ó <tipo>[] <variable>. System. b..Arrays ð Los arrays son estructuras de memoria que almacenan en una variable múltiples valores del mismo tipo ð Los arrays son objetos ⇒ se crean con new ð Se utilizan los corchetes. int a[]. ⇒ 15 length: 20 0 1 0 0 18 19 .. b y c son enteros) int[] a. ⇒ 20 System.length). b. c. c.println(a. para declarar el array y para acceder a sus elementos ð Pueden ser de cualquier tipo (primitivo o referencia) ð Declaración de arrays: <tipo> <variable>[]. 0 0 . int i = a[0]. en la posición length-1 a int[] a = new int[20].

Fecha[] festivos = { new new new new } Fecha Fecha Fecha Fecha ( 1. Recorrido de una lista: int[] lista = new lista[10].“miércoles”. 2000).“sábado”. 4. 7.out. se pueden inicializar con los valores entre llaves y separados por comas (a la vez que se declara) int[] cuadrados = {0. 1. 1. 9}. 4. 10. cuadrados[0] = 0. 2000).Inicialización de Arrays ð Cuando se instancia un objeto array.println(lista[i]). 3. 12. 2000). cuadrados[1] = 1. i++) { System. 2000). } . 5. for (int i = 0. i < lista.length.“domingo”}. ( 6.“jueves”. Ejemplos de Arrays int[] digitos = {0. ( 12. 9}. 6. equivale a int[] cuadrados = new int[4]. ( 15. 2. “viernes”. 1. cuadrados[2] = 4. sus elementos se inicializan al valor por defecto del tipo correspondiente ð Si se conocen los valores iniciales de cada elemento. cuadrados[3] = 9. 5. 8. String[] dias = {“lunes”.“martes”.

.. int[][] tresAnnos = new int[3][12].. 0 0 . Ejemplo de Arrays Multidimensionales tresAnnos length: 3 0 1 2 length: 12 0 1 0 0 10 11 length: 12 0 1 0 0 10 11 length: 12 0 1 0 0 10 11 . 0 0 ..Arrays Multidimensionales ð En Java los arrays son todos de una dimensión.. Un array bidimensional es un array de arrays ð Se necesita un conjunto de corchetes por cada dimensión int[] unAnno = new int[12]. 0 0 ..

Arrays Bidimensionales No Rectangulares
ð Un array de 2 dimensiones se puede crear sin especificar el tamaño de su segunda dimensión
int[][] tresAnnos = new int[3][]; tresAnnos[0] = new int[12]; tresAnnos[1] = new int[12]; tresAnnos[2] = new int[12];

ð Si se indica sólo una dimensión, ésta debe ser la primera
int[][] tresAnnos = new int[][3]; ⇒ ERROR

ð Esta separación permite crear arrays no rectangulares
tresAnnos[0] = new int[12]; tresAnnos[1] = new int[5]; tresAnnos[2] = new int[9];

Inicialización de Arrays Multidimensionales
ð Se necesita un conjunto de datos entre llaves para cada dimensión
int[][] matriz = { {1, 2, 3}, {4, 5, 6} };

equivale a
int[][] matriz matriz[0][0] = matriz[0][1] = matriz[0][2] = matriz[1][0] = matriz[1][1] = matriz[1][2] = = new int[2][3]; 1; 2; 3; 4; 5; 6;

Características Avanzadas de la OO

Fco. Javier Alcalá Casado

Conceptos Avanzados de la OO
ð Hay tres conceptos avanzados relacionados con la orientación a objetos:
û Encapsulación: permite la protección de ciertas partes de un objeto del acceso desde otros objetos externos û Herencia: jerarquía de clases basada en la agrupación de atributos y/o de métodos comunes û Polimorfismo: tratamiento generalizado de todas las clases pertenecientes a una jerarquía de herencia

Encapsulación
ð La encapsulación consiste en el agrupamiento de datos y su tratamiento en una misma estructura ð Permite la protección de la manipulación externa de algunas partes de los objetos ð Un objeto suele tener datos y código privados de acceso restringido ð Fuerza al usuario a utilizar una interfaz para acceder a los datos ð Hace que el código sea más fácil de mantener

Modificadores para Restringir el Acceso
ð La definición de los miembros de una clase se puede ampliar a ñadiendo modificadores al principio:
û [<modificador>] <tipo> <identificador> ; û [<modificador>] <tipo> <nombre> ( <args> ) {...}

ð Los modificadores permiten acceder a los datos o al código de manera restringida:
û public: el miembro de la clase es accesible desde

cualquier parte del código
û private: el miembro de la clase sólo es accesible desde

código perteneciente a la propia clase

public int anno ... ⇒ el método setDia() controla int d = f.. Fecha f = new Fecha() . ..mes = 14 .dia . d = f. ⇒ ERROR f.. } . f... .. private int mes . ⇒ ERROR f. public int mes . Fecha f = new Fecha() . f.mes = 14 .anno = 0 . Ejemplo de Encapsulación (II) class Fecha { private int dia . int d . f.anno = 0 .Ejemplo de Encapsulación (I) class Fecha { public int dia . } } . f. ⇒ ERROR .... f. private int mes ..dia = 34 . private int anno .getDia() .setDia(34). Fecha f = new Fecha() . } . ⇒ ERROR . } } public int getDia ( ) { return dia . el acceso .. class Fecha { private int dia .dia = 34 .. private int anno . public void setDia ( int d ) { if ( (d > 0) && (d < 32) ) { dia = d .

Jefe trabajaPara. String nombre. int salario. } class Secretaria { int numEmpleado. Caninos Felinos . por ejemplo.. int numDepart. int numDepart. int salario. String nombre. ð Las clases descendientes se llaman subclases ð Las clases ascendientes se llaman superclases ð Las subclases “heredan” características y métodos de las superclases (excepto los constructores) Herencia (II) ð Supongamos. } ð Las partes comunes se pueden agrupar en una misma clase..Herencia (I) ð Jerarquía de clases basada en agrupar atributos y/o métodos comunes Vertebrados Mamíferos Anfibios Aves .. que tenemos la clase Jefe y la clase Secretaria definidas como sigue: class Jefe { int numEmpleado. manteniendo las otras dos clases con las partes no comunes y heredando de esta nueva clase con la palabra reservada extends .. int numTrabajadores.

int numAsientos. } class Jefe extends Empleado { int numTrabajadores. int numDepart. int numAsientos. int salario. String nombre. int numAlas. } Empleado class Secretaria extends Empleado { Jefe trabajaPara. } ¿Avion es-una Bici? ⇒ NO . int salario. } Empleado Jefe class Empleado { int numEmpleado.Herencia (III) class Jefe { int numEmpleado. int numTrabajadores. } class Secretaria { int numEmpleado. se plantea la pregunta “¿la subclase es-una superclase?”. int numAsientos. Jefe trabajaPara. } class Avion extends Bici { int numAlas. } class Bici { int numRuedas. int numDepart. } Empleado Secretaria Relación “es-un” ð Para saber si la relación de herencia es correcta. int numDepart. int salario. int velocidadMax. int velocidadMax. int velocidadMax. String nombre. } class Avion { int numRuedas. String nombre. La respuesta debe ser “sí” ð ¿el Jefe es-un Empleado? ⇒ Sí ¿la Secretaria es-un Empleado? ⇒ Sí class Bici { int numRuedas.

} ¿un Coche tiene -un Motor? ⇒ Sí ¿un Coche tiene -un Chasis? ⇒ Sí ... } class Chasis { .. } class Coche { Motor m.. Chasis ch.Herencia Simple ð Si una clase hereda de una única clase se considera herencia simple ð Si una clase hereda de varias clases se considera herencia múltiple ð En Java sólo se permite la herencia simple ð La herencia simple hace que el código sea reutilizable Relación de Contenido (“tiene-un”) ð Una clase puede contener referencias de objetos de otras clases ð Se diferencia de la herencia en que es necesario instanciarlos por separado ð Responde afirmativamente a la pregunta: ¿<Contenedor> tiene-un <Contenido>? class Motor { .

} } Otras Características de la Herencia ð Todas las clases proporcionadas por Java y las que defina el programador heredan de una clase común: la clase Object El compilador añade extends Object a todas las clases que no heredan explícitamente de ninguna otra class Fecha { ....Sobreescritura de Métodos ð También llamados métodos virtuales ð Una subclase puede modificar los métodos que ha heredado de la superclase.. } ð Los miembros de la clase se pueden proteger con otro modificador. manteniendo los mismos nombre. int calcularVacaciones(){...} } class Jefe extends Empleado { int numTrabajadores.. cuyo acceso queda restringido a la clase donde se define y a todas sus subclases .. protected.. int calcularVacaciones(){.. } ⇒ class Fecha extends Object { . tipo de retorno y lista de argumentos class Empleado { .

doctor. pero una variable que hace referencia a la superclase de una jerarquía puede tener muchas formas (una por cada subclase) Empleado e1 = new Empleado().Polimorfismo ð Polimorfismo indica “muchas formas” ð Una clase sólo tiene una forma.numTrabajadores=15. doctor.... Empleado e2 = new Jefe()..} class Veterinario { void vacunar ( Mascota m ) {. Raton jerry = new Raton().. Gato tom = new Gato(). Empleado e3 = new Secretaria(). e1 e2 e3 ð Pueden utilizarse de dos maneras: û Parámetros polimórficos û Colecciones heterogéneas Empleado Empleado Empleado Jefe Secretaria Parámetros Polimórficos class Mascota {....numTrabajadores=15.} } . .vacunar(jerry). e2. Veterinario doctor = new Veterinario()... ⇒ ERROR ((Jefe)e2).vacunar(tom). ..} class Gato extends Mascota {..} class Raton extends Mascota {.

int salario. lista[1] = new Empleado(). ... listaMascotas[0] = new Mascota(). i < lista. listaMascotas[4] = new Gato(). int calcularVacaciones(){..length..} } class Jefe extends Empleado { int numTrabajadores.} } Empleado[] lista = new Empleado[100].. Ejemplo de Colecciones Heterogéneas (I) class Empleado { .out.. .. listaMascotas[2] = new Raton(). for (int i = 0.. listaMascotas[1] = new Gato()..println(lista[i]. listaMascotas[3] = new Raton(). } . lista[99] = new Empleado(). lista[0] = new Empleado().Colecciones Heterogéneas ð Hasta ahora un array sólo podía contener elementos del mismo tipo (colección homogénea) ð Utilizando polimorfismo se pueden tener elementos de distinto tipo en un array (colección heterogénea) ð Se crean utilizando arrays definidos con el tipo superclase Mascota[] listaMascotas = new Mascota[5].calcularVacaciones()). int calcularVacaciones(){. i++) { System.. lista[56] = new Jefe().

Ejemplo de Colecciones Heterogéneas (II) ð El método de cada elemento que se ejecuta es el que está marcado en negrita ð De esta forma se consigue tratar a todos los elementos por igual. Javier Alcalá Casado . aunque alguno tenga un tratamiento especial lista length: 100 0 56 99 calcVacacion( ) Empleado calcVacacion( ) Empleado calcVacacion( ) Jefe calcVacacion( ) Empleado Características Avanzadas del Lenguaje Fco.

Empleado ð Si no se indica la sentencia package.finanzas. la clase Empleado pertenecerá a un paquete por defecto sin nombre .finanzas.java: package empresa. } ð La clase Empleado realmente se llama empresa..finanzas.paquete>. ð La composición de nombres (separados por puntos) está relacionada con la jerarquía de directorios CLASSPATH\empresa\finanzas\ ð Los nombres de los paquetes se suelen escribir en minúsculas Ejemplo de Paquetes ð Fichero fuente Empleado.. Ejemplo: package empresa. public class Empleado { .Paquetes ð Un paquete es una agrupación de clases (librería) ð El programador puede crear sus propios paquetes con la sentencia package al principio del fichero fuente package <nombre.

paquete>. public class Jefe extends Empleado { String departamento.lang.Empleado ð La clase Jefe pertenece al paquete anónimo por defecto ð String pertenece al paquete java.finanzas.Sentencia import ð La sentencia import indica al compilador dónde están ubicadas las clases que estamos utilizando ð Para importar sólo una clase de un paquete: import <nombre. ð El compilador añade a todos los ficheros la línea import java.) Ejemplo de import import empresa. deberíamos referirnos a Empleado como empresa.lang No necesita sentencia import ..del. Empleado[] subordinados.<NombreClase>.finanzas. Object. } ð Si no se pone el import. ð Para importar todas las clases de un paquete: import <nombre.*.paquete>..*. String.del.*. que es el paquete que contiene las clases fundamentales para programar en Java (System.

..} . no a los objetos [<modifAcceso>] [static] <tipo> <identificador>. [<modifAcceso>] [static] <tipo> <nombre> ( <args> ) {.Control de Acceso Avanzado ð Las variables y métodos de una clase pueden estar en cualquiera de los cuatro niveles de acceso: û publico (public): acceso total desde cualquier código û por defecto (cuando no se pone nada): desde la misma clase y el mismo paquete û protegido (protected): acceso desde una jerarquía de clases û privado (private): máxima protección Modificador Misma clase Subclases public X X ∅ X X protected X X private X Mismo paquete Universal X X X Modificador static ð Los miembros de una clase pertenecen a los objetos ð Para acceder a las variables y métodos de una clase es necesario crear primero un objeto ð El modificador static puede aplicarse a variables y a métodos para acceder a ellos sin instanciar ning ún objeto ð Los miembros estáticos pertenecen a la clase.

hay que utilizar el nombre de la clase a la que pertenece double tangente ( double x ) { return Math. public static y .sin(x) / Math. public static void main (String args[]) { y = 15 . } Variables y Métodos Estáticos (II) ð Los métodos estáticos sólo pueden acceder a sus propios argumentos y a las variables estáticas y no se pueden sobreescribir public class Error { int x .cos(x) .Variables y Métodos Estáticos (I) ð Los miembros estáticos pertenecen a la clase y son accesibles por todos los objetos de esa clase ð Una variable estática es una variable global dentro de la clase ð Para acceder a un miembro estático. x = 20 . ⇒ ERROR } } .

. Cuenta().} class Felino extends Mamifero {. Cuenta(). Cuenta contador: 3 cont length: 3 0 1 2 numSerie: 1 numSerie: 2 numSerie: 3 Clases Abstractas ð Una clase abstracta es una clase de la que no se pueden crear objetos ð Representa un concepto que no se puede instanciar ð Se define anteponiendo el modificador abstract a la definición de una clase abstract class Mamifero {... } } .. private static int contador = 0... Cuenta(). = new Cuenta[3]. numSerie = contador.} class Canino extends Mamifero {.Ejemplo static public class Cuenta { private int numSerie.} .} class Roedor extends Mamifero {. Cuenta[] cont cont[0] = new cont[1] = new cont[2] = new .. ⇒ ERROR .. public Cuenta() { contador++..... Mamifero m = new Mamifero()...

} } class Felino extends Mamifero { . public abstract void alimentar()... color Figura ptoOrigen dibujar() abstract class Figura { Punto ptoOrigen.} } class Circulo extends Figura { int radio.. } class Rectangulo extends Figura { Punto ptoFinal. } ð Todas las subclases de una clase abstracta deben implementar los métodos abstractos que tenga definidos class Canino extends Mamifero { . abstract void dibujar(). void dibujar() {.} } Ejemplo ð Jerarquía de figuras geométricas: class { int int int } Punto x... public void alimentar() {.. void dibujar() {.. public void alimentar() {.. y. color.} } Rectangulo ptoFinal dibujar() Circulo radio dibujar() .Métodos Abstractos ð Un método es abstracto si se declara (dentro de una clase abstracta)..... pero no se implementa abstract class Mamifero { . y. Punto x...

. <tipo> <nombreMétodo2> ( <args> ). aunque no lleven código class <NombreClase> implements <NombreInterfaz> { <tipo> <nombreMétodo1> ( <args> ) { <código> } <tipo> <nombreMétodo2> ( <args> ) { <código> } . } ð Una clase que implemente el código de la interfaz debe implementar todos sus m étodos..Interfaces (I) ð Una interface es un conjunto de declaraciones de métodos ð Declaración: interface <NombreInterfaz> { <tipo> <nombreMétodo1> ( <args> ). } Interfaces (II) ð Las interfaces sirven para: û Declarar métodos que serán implementados por una o más clases û Definir la interfaz de programación de un objeto.. sin mostrar el cuerpo actual de la clase ð Cada interfaz debe escribirse en un fichero *.java con el mismo nombre de la interfaz ...

determina si las referencias apuntan a un mismo objeto public boolean equals ( Object obj ) ð El método equals() y el operador == comparan las referencias de los objetos. <métodoN>(). abstract <tipo> <métodoN>().Clase Abstracta interface { <tipo> <tipo> .... Date.. equivale a abstract class Interfaz { abstract <tipo> <método1>(). . File) en las que devuelve true cuando el contenido y el tipo de dos objetos son iguales ð Cualquier clase definida por el usuario puede sobreescribir el método equals() . no sus contenidos ð El método equals() está sobreescrito en ciertas clases (String.Equivalencia Interfaz . abstract <tipo> <método2>(). } Operadores de Comparación de Objetos (I) ð El método equals(). <método2>(). <tipo> } Interfaz <método1>(). definido en la clase Object.

1.. if (s1. String s2 = new String(“Hola”).. ð s1. if (f1.2000).. if (f1 == f2) ⇒ false .... Fecha f2 = new Fecha(1. ð String s1 = new String(“Hola”). if (s1 == s2) ⇒ false ..equals(s2) equivale a s2.equals(s1) Excepciones Fco.equals(f2)) ⇒ false .2000)..Operadores de Comparación de Objetos (II) ð Fecha f1 = new Fecha(1. Javier Alcalá Casado .equals(s2)) ⇒ true .1.

. se coloca el código que puede causarlas dentro de la cláusula try y tantas cláusulas catch como posibles excepciones haya .catch ð Sintaxis: try { // Código que puede provocar excepciones } catch (<NombreExcepción1> e1 ) { // Código que gestiona la excepción 1 } catch (<NombreExcepción2> e2 ) { // Código que gestiona la excepción 2 } ð Para gestionar excepciones. fichero que no existe. se termina la ejecución del programa con un mensaje de error ð Programar manejando excepciones hace que se separen el código de la tarea a realizar y el código de control de errores Ejemplo: abrir y leer de un fichero Sentencia try ..) ⇒ Tolerancia a fallos ð Estos errores reciben el nombre de excepciones ð Si no se gestiona una excepción.Introducción ð Java incorpora en el lenguaje el manejo de errores en tiempo de ejecución (división por cero. índice fuera de límites.

Propagación de Excepciones ð Consideremos el siguiente caso: û main() llama al método primero() û primero() llama al método segundo() û en segundo() se produce una excepción main() ⇒ primero() ⇒ segundo() ð Si segundo() no captura la excepción con un catch. Por último. si en main() tampoco se gestiona. si éste tampoco la trata. se ejecuta finally antes de devolver el valor . se termina el programa con un error de ejecución Cláusula finally ð try { // Código protegido que puede provocar excepciones } finally { // Código que se ejecuta siempre al final } ð La cláusula finally define un bloque que se ejecuta siempre independientemente de que se haya capturado. o no. se propaga a main(). la excepción ð Si dentro de try hay alguna sentencia return. se propaga a primero().

. regarCesped().Ejemplo try .finally ð Sistema de riego automático: try { abrirGrifo().... } Jerarquía de Excepciones (I) Throwable Error Exception RuntimeException NullPointerException IndexOutOfBoundsException NegativeArraySizeException . avisarFontanero(). IOException EOFException FileNotFoundException MalformedURLException .. . } finally { cerrarGrifo().catch .. } catch (MangueraRotaException e) { darAlarma(). .

<Excepción2>. AWTException.) son excepciones explícitas que Java obliga a tenerlas en cuenta y capturarlas en algún lugar del código ⇒ Código robusto Regla: “Capturar y/o Propagar” ð La gestión de excepciones explícitas se puede hacer de tres maneras: û Capturando la excepción con try – catch û Propagando la excepción.] { // Código del método } û Capturando y propagando la excepción ð Si no se capturan ni se propagan.. Para ello hay que indicarlo explícitamente en la declaración del método [<modificador>] <tipo> <nombre> ( [<args>] ) throws <Excepción1> [.. Son irrecuperables (no se capturan) ð Los errores de la clase Exception se pueden capturar: û RuntimeException: son excepciones muy frecuentes relacionadas con errores de programación. de la JVM o de compilación... Son excepciones implícitas que se pueden no capturar û Las demás (IOException. se producen errores de compilación .Jerarquía de Excepciones (II) ð La clase Throwable es la superclase de todos los errores y excepciones que se pueden producir en Java ð La clase Error está relacionada con errores del sistema.

ð Con la sentencia throw se genera explícitamente una excepción especificada Ejemplo: . Creación de Excepciones de Usuario ð Las excepciones definidas por el usuario.. IOException ioe = new IOException() . ...... throw ioe .Sentencia throw ð Sintaxis: throw <variableExcepción> . throw new IOException() . equivale a .. .. } } ð Las excepciones de usuario se deben lanzar con throw ... se crean como clases que extienden la clase Exception ð Pueden contener variables y métodos miembro como cualquier otra clase Ejemplo: class MangueraRotaException extends Exception { public MangueraRotaException ( ) { .

. Javier Alcalá Casado Introducción (I) ð Java representa la E/S con un stream (flujo de datos) ð Un stream es una conexión entre el programa y la fuente o destino de los datos ð La información se traslada en serie por el stream ð Este concepto representa cualquier E/S: û lectura/escritura de archivos û comunicación a través de Internet û lectura de la información de un puerto serie û ...Entrada/Salida Fco.

hay que utilizar el método close() .Introducción (II) ð Las clases de E/S se encuentran en el paquete java.. recurso de Internet.. Para cerrarlo.).io ð Hay dos jerarquías diferentes según el tipo de datos: û para operaciones con bytes û para operaciones con caracteres (un carácter Unicode está formado por dos bytes) ð Para cada una de las jerarquías hay dos clases definidas según la dirección de las operaciones: û para manejar la entrada û para manejar la salida Introducción (III) ð Operaciones con bytes: û para lectura (entrada): clase InputStream û para escritura (salida): clase OutputStream ð Operaciones con caracteres (texto): û para lectura (entrada): clase Reader û para escritura (salida): clase Writer ð Las cuatro clases son abstractas ð Instanciar una subclase de alguna de éstas equivale a abrir un stream (archivo.

Jerarquías de E/S de Bytes ð InputStream û FileInputStream û PipedInputStream û ByteArrayInputStream û StringBufferInputStream ð OutputStream û FileOutputStream û PipedOutputStream û ByteArrayOutputStream û FilterOutputStream Ÿ Ÿ Ÿ Ÿ DataOutputStream BufferedOutputStream PushbackOutputStream PrintStream û SequenceInputStream û FilterInputStream Ÿ Ÿ Ÿ Ÿ DataInputStream LineNumberInputStream BufferedInputStream PushbackInputStream û ObjectOutputStream û ObjectInputStream Jerarquías de E/S de Caracteres ð Reader û BufferedReader Ÿ LineNumberReader ð Writer û BufferedWriter û CharArrayWriter û OutputStreamWriter Ÿ FileWriter û CharArrayReader û InputStreamReader Ÿ FileReader û FilterWriter û PipedWriter û StringWriter û PrintWriter û FilterReader Ÿ PushbackReader û PipedReader û StringReader .

OutputStream Lectura/Escritura de bytes Reader. CharArray.Uso de las Clases de E/S ð Las clases en negrita indican que hay un dispositivo con el que se conecta el stream (disco. BufferedReader bf = new BufferedReader(fr).bat”).) ð Las otras clases a ñaden características particulares a la forma de enviar los datos por el stream ð La intención es combinar ambos tipos de clases para obtener el comportamiento deseado. URL. empezando por una “clase en negrita” y luego a ñadiendo características Ejemplo: FileReader fr = new FileReader(“autoexec. StringBuffer Piped Buffered Filter Data Object Print Lectura/Escritura de caracteres Ficheros Memoria (según el tipo de datos indicado) Tubo de datos Buffer Filtro Intercambio de datos de Java Persistencia de objetos Imprimir . memoria. ByteArray. Writer File String... Nombre de las Clases de E/S ð Se puede deducir la función de una clase según las palabras que componen su nombre: InputStream.

int.int) escribe el array de bytes dado empezando en la posición dada con la longitud dada ð Otros métodos: void close() void flush() cierra el stream abierto fuerza a que se escriban las operaciones de escritura que haya pendientes .int) lee un conjunto de bytes y lo pone en el array de bytes dado empezando en la posición dada con la longitud dada. Devuelve el número de bytes leídos int read() ð Otros métodos: void close() cierra el stream abierto int avaible() devuelve el número de bytes disponibles para leer long skip(long) salta el número de bytes indicado Métodos de OutputStream ð Métodos básicos de escritura: void write(int) escribe el byte de menor peso void write(byte[]) escribe el array de bytes dado void write(byte[]. Devuelve el número de bytes leídos int read(byte[].int.Métodos de InputStream ð Métodos básicos de lectura: devuelve un byte leído o -1 si es fin de fichero (en el byte de menor peso) int read(byte[]) lee un conjunto de bytes y lo pone en el array de bytes dado.

int. Devuelve el número de bytes leídos int read() ð Otros métodos: void close() cierra el stream abierto long skip(long) salta el número de caracteres indicado Métodos de Writer ð Métodos básicos de escritura: void write(int) void void escribe el carácter contenido en los dos bytes de menor peso write(char[]) escribe el array de caracteres dado write(char[].int) escribe el array de caracteres dado empezando en la posición dada con la longitud dada write(String) escribe una cadena de caracteres write(String.int) escribe la cadena de caracteres dada empezando en la posición dada con la longitud dada void void ð Otros métodos: void close() void flush() cierra el stream abierto fuerza a que se escriban las operaciones de escritura que haya pendientes .Métodos de Reader ð Métodos básicos de lectura: devuelve un carácter leído o -1 si es fin de fichero int read(char[]) lee un conjunto de caracteres y lo pone en el array de bytes dado.int. Devuelve el número de bytes leídos int read(char[].int) lee un conjunto de caracteres y lo pone en el array de bytes dado empezando en la posición dada con la longitud dada.int.

bin”). pero llena // el buffer de datos para // próximas lecturas . Si no se encuentra el archivo dado. // lee un sólo byte. pueden lanzar la excepción FileNotFoundException ð En la escritura. por defecto escribe desde el comienzo. Si ya existe. de modo que se lee del disco (o se escribe) un conjunto de bytes o caracteres en cada acceso Lectura y Escritura de Archivos (II) ð En la lectura. pero se puede indicar que a ñada al final (con un 2º parámetro true) FileInputStream fis = new FileInputStream(“fich. se utilizan las clases que implementan un buffer.read().Lectura y Escritura de Archivos (I) ð Las clases FileInputStream y FileOutputStream permiten leer y escribir bytes en archivos binarios ð Las clases FileReader y FileWriter permiten leer y escribir caracteres en archivos de texto ð Cada llamada a read() o write() accede al disco para un único byte o un único carácter ⇒ poco eficiente ð Para mejorarlo. se crea nuevo. BufferedInputStream bis = new BufferedInputStream(fis). int b = bis. los constructores de FileInputStream y FileReader . los constructores de FileOutputStream y FileWriter pueden lanzar la excepción IOException. si no encuentran el archivo indicado.

} catch (IOException e2) {} finally { bis. } .Lectura de Archivos Binarios try { FileInputStream fis.println(“Archivo no encontrado:”+e1). int dato.bin”). bos = new BufferedOutputStream(fos).close(). BufferedOutputStream bos.bin”). bis = new BufferedInputStream(fis). dato = (int)’A’. // lee hasta el // fin del stream } catch (FileNotFoundException e1) { System. BufferedInputStream bis. fis = new FileInputStream(“archivo.err. } catch (IOException e) { } finally { bos. } Escritura de Archivos Binarios try { FileOutputStream fos.write(dato). int dato. fos = new FileOutputStream(“archivo. while ((dato=read()) != -1) .close(). // casting para llamar a write bos.

try { FileReader fr = new FileReader(“archivo.println(“Archivo no encontrado:” + e1).close().txt”). } Escritura de Archivos de Texto (I) try { FileWriter fw = new FileWriter(“archivo. PrintWriter pw = new PrintWriter(bw).println(“Esta es la primera línea”). } . } catch (IOException e) { } finally { pw. BufferedReader br = new BufferedReader(fr). pw.close().txt”). BufferedWriter bw = new BufferedWriter(fw). String linea. while ((linea=br. } catch (IOException e2) {} finally { br. } } catch (FileNotFoundException e1) { System.err.readLine()) != null) { texto += linea.Lectura de Archivos de Texto String texto = new String().

. InputStreamReader isr = new InputStreamReader(fis).close(). String s = br.true).println(“Esta es la segunda línea”)..close(). BufferedReader br = new BufferedReader(isr).readLine(). . BufferedWriter bw = new BufferedWriter(fw).Escritura de Archivos de Texto (II) // modo append (añadiendo al final del archivo) try { FileWriter fw = new FileWriter(“archivo. } catch (IOException e) { } finally { pw. } Conversión de Streams de Bytes a Caracteres ð Las clases InputStreamReader y OutputStreamReader permiten convertir un stream de bytes en un stream de caracteres. br.txt”. pw.bin”). para lectura y escritura respectivamente FileInputStream fis = new FileInputStream(“f. PrintWriter pw = new PrintWriter(bw). ð Las clases InputStreamReader y OutputStreamReader son la única relación entre ambas jerarquías ð No existen clases que realicen la conversión inversa .

ð Escritura de datos primitivos : FileOutputStream fos = new FileOutputStream(“f. dos. float f = dis. dos.readInt().15F).readBoolean().bin”). dis.writeBoolean(true). dos. DataInputStream dis = new DataInputStream(bis).bin”). boolean b = dis. int i = dis. .writeInt(7). BufferedOutputStream bos = new BufferedOutputStream(fos).readFloat().DataInputStream y DataOutputStream ð Las clases DataInputStream y DataOutputStream permiten leer y escribir tipos primitivos en modo binario ð Métodos de DataInputStream: boolean readBoolean() byte readByte() int readInt() float readFloat() char readChar() short readShort() long readLong() double readDouble() ð Métodos de DataOutputStream : void writeBoolean(boolean) void writeByte(byte) void writeInt(int) void writeFloat(float) void writeChar(char) void writeShort(short) void readLong(long) void writeDouble(double) Uso de DataInputStream y DataOutputStream ð Lectura de datos primitivos: FileInputStream fis = new FileInputStream(“f. BufferedInputStream bis = new BufferedInputStream(fis).close(). DataOutputStream dos = new DataOutputStream(bos).close().writeFloat(3. dos.

String nombre) File f1 = new File(“C:\\windows\\notepad. atributos. ”notepad. “notepad.exe”).La Clase File ð La clase File hace referencia a un archivo o un directorio ð Se utiliza para obtener información del archivo o del directorio (tamaño. File f3 = new File(“C:\\windows”). fecha..exe”)..exe”).) ð Constructores: û File(String nombre) û File(String dir. Métodos de la Clase File (I) ð Si File representa un archivo: boolean exists() boolean isFile() long length() long lastModified boolean canRead() boolean canWrite() boolean delete() boolean renameTo(File) boolean isDirectory() boolean mkdir() boolean delete() String[] list() true si el archivo existe true si el objeto es una archivo tamaño del archivo en bytes fecha de la última modificación true si se puede leer true si se puede escribir borra el archivo cambia el nombre true si el objeto es un directorio crea el directorio borra el directorio devuelve los archivos que se encuentran en el directorio ð Si File representa un directorio . String nombre) û File(File dir. File f2 = new File(“C:\\windows”. File f4 = new File(f3.

Métodos de la Clase File (II) ð Otros m étodos de la clase File relacionados con el path del archivo: devuelve el path que contiene el objeto File String getName() devuelve el nombre del archivo String getAbsolutePath() devuelve el path absoluto String getParent() devuelve el directorio padre String getPath() Entrada/Salida Estándar ð En Java la entrada desde teclado y la salida a pantalla se realizan a través de la clase System ð System contiene tres atributos estáticos: û System.in: objeto de la clase InputStream que lee datos de la entrada estándar (teclado) û System.err: objeto de la clase PrintStream que escribe mensajes de error en la salida estándar (pantalla) .out: objeto de la clase PrintStream que escribe datos en la salida estándar (pantalla) û System.

read()) != ‘\n’) linea += c.read() permite leer. que debe ser tratada ð Para leer un tipo diferente de int. //Concatena c con linea } catch (IOException exc) { } .in. hay que hacer un cast try { char c = (char)System.in.in. e n cada llamada. } catch (IOException exc) { // tratamiento de la excepción } Entrada desde Teclado (II) ð Para leer toda una línea se debe usar un bucle. String linea = new String(“”).read(). un único carácter y lo devuelve como int ð Puede provocar la excepción IOException. unir los caracteres y detectar el carácter ’\n’ char c.Entrada desde Teclado (I) ð El método Sistem. try { while ((c = System.

print(<argumento>): imprime por pantalla el argumento dado independientemente del tipo que sea û System. También puede lanzar la excepción IOException try { InputStreamReader isr. . } catch (IOException exc) {} Salida por Pantalla ð Se utilizan los métodos: û System. System. br = new BufferedReader(isr).in).out. String linea = br. û varios valores concatenados con el operador + System.out.println(numeroPI). isr = new InputStreamReader(System.readLine().println(“Hola Mundo”).Entrada desde Teclado (III) ð Un método más eficiente y “sencillo” para leer de teclado utiliza la clase BufferedReader que contiene el método readLine() ð readLine() lee caracteres de un stream hasta encontrar un delimitador de línea y los devuelve como un String.141592654.println(“Hola Mundo” + numeroPI). BufferedReader br. pero añadiendo un salto de línea ð Ambos métodos pueden imprimir: û valores directamente System. double numeroPI = 3.out.println(<argumento>): igual que el anterior.out.out.

upm. InputStreamReader isr = new InputStreamReader(dir. BufferedReader br = new BufferedReader(isr). String s = br.sia.es/index.openStream()).Lectura de un Archivo de Internet ð Java proporciona un mecanismo que permite leer archivos de Internet mediante un stream ð La clase URL del paquete java...net representa una dirección de Internet ð El método InputStream openStream(URL dir) de URL abre un stream de lectura con origen en la dirección dada URL dir = new URL(“http://www. Clases Útiles Fco. .eui.readLine().html”). Javier Alcalá Casado .

int) Devuelve un String extraído de otro toLowerCase() Convierte en minúsculas toUpperCase() Convierte en mayúsculas trim() Elimina los espacios en blanco al comienzo y final de la cadena String(.. es decir.char) Sustituye un carácter por otro startsWith(String) Indica si un String comienza con otro substring(int. mientras que la clase StringBuffer ofrece más posibilidades ð El operador + entre objetos String utiliza internamente la clase StringBuffer y su método append() ð Se pueden utilizar lo métodos de String sobre literales Ejemplo: “Hola”. añadiendo o borrando caracteres ð La clase String es más eficiente..char[].int) Copia los caracteres indicados en la pos indicada de un array de caracteres indexOf(String.) .length() La Clase String Constructores para crear String a partir de varios tipos String(StringBuffer) Constructor a partir de un StringBuffer charAt(int) Devuelve el carácter en la pos indicada getChars(int.lang que permiten la manipulación de cadenas de caracteres: û La clase String maneja cadenas constantes. que no pueden cambiar û La clase StringBuffer permite cambiar la cadena insertando.int.Clases para Manejar Cadenas de Caracteres ð Hay dos clases en el paquete java.int) Devuelve la pos en la que aparece un String dentro de otro lastIndexOf(String) Devuelve la última vez que un String aparece en otro hacia el principio length() Devuelve el número de caracteres replace(char.

) Inserta un String o un valor en la posición indicada length() Devuelve el número de caracteres reverse() Cambia el orden de los caracteres setCharAt(int.char) Cambia el carácter en la posición indicada setLength(int) Cambia el tamaño del StringBuffer toString() Convierte el StringBuffer en String StringBuffer(...La Clase StringBuffer Constructores para crear StringBuffer a partir de varios tipos append(. [ ].int. aunque sus elementos sólo utilicen una parte ð El tamaño del vector se incrementa por bloques cuando se añade y se agota el espacio reservado.util) representa una colección heterogénea de objetos (referencias a objetos de tipo Object o a cualquiera de sus subclases) ð El vector al crearse reserva cierta cantidad de memoria..int) Copia los caracteres indicados en la pos indicada de un array de caracteres insert(int.. El tamaño de incremento se indica en el atributo capacityIncrement ð El vector se mantiene compacto en todo momento ð Cada elemento es accesible a través de un índice. pero no con los corchetes.) Añade un String o una variable de cualquier tipo al StringBuffer capacity() Devuelve el espacio libre del StringBuffer charAt(int) Devuelve el carácter en la pos indicada getChars(int.) La Clase Vector (I) ð La clase Vector (paquete java.char[]. sino con el método elementAt(index) .

int index) reemplaza el objeto que corresponde al índice por el objeto que se le pasa (*) void removeElementAt(int index)borra el objeto situado en la posición indicada (*) void addElement(Object elem) añade un objeto al final void insertElementAt(Object elem.int index) inserta el objeto que se le pasa en la posición indicada. incremento 0) û Vector(int initialCapacity): Crea un vector vac ío con la capacidad dada (incremento 0) û Vector(int initialCapacity. Si vale cero. duplica el tamaño actual del vector û int elementCount: número de elementos v álidos del vector û Object[] elementData: array de objetos donde se guardan los elementos ð Constructores: û Vector(): Crea un vector vac ío (capacidad 10. int initialIncrement): Crea un vector vacío con la capacidad y el incremento dados La Clase Vector (III) ð Métodos: devuelve la capacidad que tiene el vector devuelve el número de elementos en el vector boolean contains(Object elem) devuelve true si el vector contiene el objeto especificado int indexOf(Object elem) devuelve la posición de la primera vez que aparece el objeto que se le pasa Object elementAt(int index) devuelve el elemento situado en la posición indicada (*) void setElementAt(Object elem. desplazando el resto de elementos en el vector (*) int capacity() int size() Los métodos con (*) pueden lanzar la excepción ArrayIndexOutOfBoundsException .La Clase Vector (II) ð Atributos: û int capacityIncrement: incremento en la capacidad del vector.

.) PI Constante con el valor π (3.double y) x elevado a y double sqrt(double) Raíz cuadrada de x double max(double a.718. Los trata de forma diferente por razones de eficiencia ð Las clases envolventes son un complemento de los tipos primitivos ð Cada tipo primitivo tiene su correspondiente clase envolvente en el paquete java.La Clase Math ð La clase Math del paquete java...double) Arco tangente entre -π y π double exp(double) Exponencial de x double log(double) Logaritmo neperiano de x double pow(double x.double b) Mínimo entre a y b double random() Número aleatorio ∈[0.double b) Má ximo entre a y b double min(double a.lang tiene todos sus miembros estáticos E Constante del número e (2.) double abs(double x) Valor absoluto de x long round(double x) Entero más cercano a x double ceil(double x) Entero más cercano hacia +infinito double floor(double x) Entero más cercano hacia -infinito double cos(double x) Coseno de x double sin(double x) Seno de x double tan(double x) Tangente de x double acos(double x) Arco coseno de x double asin(double x) Arco seno de x double atan(double x) Arco tangente de x entre -π/2 y π/2 double atan2(double.1415.lang: byte int float boolean ⇒ ⇒ ⇒ ⇒ Byte Integer Float Boolean short long double char ⇒ ⇒ ⇒ ⇒ Short Long Double Character ..1.0.0) Clases Envolventes ð Java no trata a los tipos primitivos como objetos.

La Clase Integer Constructor desde el tipo primitivo Constructor desde una cadena de caracteres Convierte al tipo primitivo byte Convierte al tipo primitivo short Convierte al tipo primitivo int Convierte al tipo primitivo long Convierte al tipo primitivo float Convierte al tipo primitivo double Convierte un String a Integer Convierte un String en entero con signo Convierte el objeto a String Devuelve un nuevo objeto Integer con el valor del String String toBinaryString(int) Crea un String en base 2 String toOctalString(int) Crea un String en base 8 String toHexString(int) Crea un String en base 16 MAX_VALUE Constante con el valor máximo posible MIN_VALUE Constante con el valor mínimo posible TYPE Constante que representa al tipo primitivo Integer(int) Integer(String) byte byteValue() short shortValue() int intValue() long longValue() float floatValue() double doubleValue() Integer decode(String) int parseInt(String) String toString() Integer valueOf(String) La Clase Double Double(double) Double(String) byte byteValue() short shortValue() int intValue() long longValue() float floatValue() double doubleValue() String toString() Double valueOf(String) boolean isInfinite() boolean isNaN() MAX_VALUE MIN_VALUE POSITIVE_INFINITY NEGATIVE_INFINITY NaN TYPE Constructor desde el tipo primitivo Constructor desde una cadena de caracteres Convierte al tipo primitivo byte Convierte al tipo primitivo short Convierte al tipo primitivo int Convierte al tipo primitivo long Convierte al tipo primitivo float Convierte al tipo primitivo double Convierte el objeto a String Devuelve un nuevo objeto Double con el valor del String Devuelve true si es infinito Devuelve true si no es un n úmero (Not-a-Number) Constante con el valor máximo posible Constante con el valor mínimo posible Constante con el valor +∞ Constante con el valor -∞ Constante con el valor NaN Constante que representa al tipo primitivo .

Javier Alcalá Casado Introducción (I) ð Un ordenador con un solo procesador es monotarea ð Algunos sistemas operativos simulan multitarea. dividiendo el tiempo del procesador entre varios procesos ð Un proceso es cada uno de los programas o aplicaciones que se ejecutan de forma independiente Tiene asociado: û Tiempo de CPU û Memoria para CÓDIGO û Memoria para DATOS ð Un thread (también llamado hilo o hebra de ejecución o proceso ligero) es un flujo de ejecución simple dentro de un proceso .Threads Fco.

con varios threads ejecutándose a la vez: û Garbage Collector û AWT (Abstract Window Toolkit) û Método main() ð Un hilo tiene asociado tiempo de CPU. desde el punto de vista del SO. multihilo ð La JVM es un proceso. memoria para código y memoria para datos.Introducción (II) ð Un único proceso puede tener varios hilos ⇒ multihilo ð Multitarea vs. Creación de un Thread ð Hay dos formas de crear un thread û Declarar una clase que implemente la interfaz Runnable y crear un objeto de tipo Thread a partir de ella û Crear una clase que herede de la clase Thread ð La clase Thread encapsula todo el control necesario sobre los hilos de ejecución ð Hay que distinguir claramente entre un objeto Thread (parte estática) y un hilo de ejecución o thread (parte dinámica) La única forma de controlar el comportamiento de los hilos es a través de la clase Thread . pero se puede comunicar. coordinar y sincronizar con otros hilos.

// Crea el hilo t. // Lo ejecuta } } Ejemplo: Hola Multihilo implementando Runnable class Hilo implements Runnable { String nombre . soy " + nombre ) .start ( ) . Thread t = new Thread(hr).println(“Hola Mundo”).sleep((int)(Math. i++ ) new Thread ( new Hilo("Hilo "+i) ).println("Hola. } } .out.Creación de un Thread implementando Runnable class HiloRunnable implements Runnable { public void run ( ) { System.out.currentThread(). } } class HolaMundo { public static void main (String args[]) { HiloRunnable hr = new HiloRunnable ( ). i < 10 .start(). } public void run ( ) { try { Thread.random()*3000)). } catch ( InterruptedException e ) { } System. } } class MultiHola { public static void main (String args[]) { for (int i = 0 . Hilo ( String n ) { nombre = n .

out. Hilo ( String n ) { nombre = n .Creación de un Thread extendiendo Thread class HiloThread extends Thread { // Sobreescribe el método run() public void run ( ) { System. } public static void main (String args[]) { for (int i = 0 . soy " + nombre ) . i < 10 .println("Hola. i++ ) new MultiHola("Hilo "+i). } public static void main (String args[]) { Thread t = new HiloThread().out. } } . // Lo ejecuta } } Ejemplo: Hola Multihilo extendiendo Thread class MultiHola extends Thread { String nombre .println(“Hola Mundo”).start(). } public void run ( ) { try { sleep( (int)(Math. } catch( InterruptedException e ) { } System. // Crea el hilo t.random()*3000) ).start ( ) .

. pero no inicializado con el método start() û Ejecutable: el thread puede estar ejecutándose o preparado para ejecutarse.e.Características de Ambos Métodos de Creación ð Implementar la interfaz Runnable û Mejor diseño orientado a objetos û Limitado por la herencia simple ⇒ Applets ð Extender la clase Thread û Código más simple û Complica futuras modificaciones del código Estados de un Thread ð Un thread puede estar en cuatro estados: û Nuevo: el thread ha sido creado. p. E/S de disco û Muerto: terminación del thread al finalizar el método run() Nuevo start() Ejecutable sleep() otros Bloqueado Método run() finalizado Muerto . pero está esperando que termine alguna otra tarea. Se inicia con start() û Bloqueado: el thread podría estar ejecutándose.

000 Saldo = Saldo – 150 Saldo = Saldo – 100 Cobrar 150 t Saldo final: 900 .000 € û Operaciones que se van a realizar en un instante dado: Ÿ Sacar desde un cajero 100 € Ÿ Cobro de un recibo de 150 € û Ambas operaciones tienen la misma estructura: Ÿ Comprobar si se puede realizar la operación bancaria Ÿ Realizar la operación û El banco dispone de un servidor que atiende este tipo de peticiones lanzando un hilo por cada una de ellas û Tras la ejecución de ambos hilos.000 Sacar 100 Comprueba saldo: 1. puede suceder lo siguiente: Saldo inicial: 1.Sincronización de Threads (I) ð Problema de la cuenta bancaria: û Saldo de la cuenta: 1. la cuenta se debería quedar con 750 € Sincronización de Threads (II) ð Si la ejecución de ambas operaciones se realizan simultáneamente.000 Comprobar saldo: 1.

.. impresora. objeto.cantidad .) accesible por más de un thread a la vez ð La sincronización es un mecanismo que evita que se haga más de un acceso simultáneo a una región crítica ð El modificador synchronized permite la ejecución exclusiva de un método sin ser interrumpido public synchronized void sacarCajero (int cantidad) { int saldo = getSaldo(). if (saldo > cantidad) saldo = saldo . } .Sincronización de Threads (III) ð Una región crítica es un recurso (fichero.

Sign up to vote on this title
UsefulNot useful