Professional Documents
Culture Documents
Alumno=new array(juan,perez,17,informtica,cicloI)
Qu es JAVA?
Java es un lenguaje de programacin que hace sencilla la construccin de aplicaciones distribuidas. Java, inicialmente oak, fue desarrollado por James Gosling de Sun Microsystems y presentado en sociedad en 1995. Presenta una sintaxis similar a la de C++, pero evita algunos de sus inconvenientes(aritmtica de punteros). La gestn de memoria la realiza automticamente el lenguaje.
Java, esto es, un programa/procesador de este cdigo binario. Es esta mquina virtual la que depender de la plataforma, pero el codigo binario es comn y compatible para todas ellas, el bytecode (cdigo binario) podr ejecutarse directamente en la mquina virtual de un PC, una mquina SUN, ALPHA, PPC, etc. Los ejecutables de Java se denominan ficheros de clases debido a que contienen clases. Dichas clases se obtienen directamente del programa, del disco o de la red. El kit de desarrollo JDK contiene una mquina virtual para ejecutar bytecodes y dispone a su vez de una mquina virtual especial que es un visor de applets ejecutables java que se incluyen en los ficheros HTML. Asimismo la mayora de navegadores contienen una mquina virtual Java para ejecutar dichos applets.
Caractersticas de JAVA
Seguridad Java tiene tres elementos para garantizar la seguridad de sus aplicaciones. Comprobacin del cdigo en el momento de su carga. Almacenamiento de clases de procedencia diferente en sitios diferentes. Por ltimo el Gestor de Seguridad de la MV Java determina que actividades y bajo que condiciones pueden ejecutar los programas, por ejemplo, en las MV implementadas en aplicaciones como Netscape y IE el
Gestor de Seguridad no permite el acceso a archivos de disco. Estndares abiertos y el ncleo API Una misma aplicacin puede ser ejecutada directamente en diferentes plataformas y adems existe un API (interfaz de prgramacin) de la aplicacin comn para todas las plataformas, es decir, existe un conjunto de librerias de funciones comunes para todas las plataformas. Dinmico y distribuido El cargador de clases de la MV obtiene las distintas clases tanto del disco local, como de posibles distintos puntos de la red adems slo obtiene las clases que va a necesitar. Esto permite disponer de aplicaciones distribuidas, distintas partes de cdigo se mantienen en diferentes localizaciones, evitando la duplicidad de cdigo. Orientado a Objetos Java admite el paradigma de programacin orientada a objetos de una forma natural. Un lenguaje se clasifica como orientado a objetos si reune las caractersticas siguientes:
Un objeto es una encapsulacin abstracta de informacin, junto con los mtodos o procedimientos para manipularla.
Multihilo Una aplicacin multihilo es una apliacin que tiene varios subprogramas ejecutantdose de forma independiente y simultanea. Gestin de Memoria y recoleccin de basura En C y C++ uno de las mayores fuentes de error y de problemas es el manejo y control temporal de memoria, siendo responsabilidad del programador el control adecuado de sta. En Java este problema queda relegado al lenguaje, para ello implementa un recolector de basura. ste es un proceso que se encarga de liberar de forma automtica toda la memoria temporal que no aparece referenciada por ninguna parte del programa.
java: interprete de Java, para ejecutar los bytecodes. appletviewer: interprete de Java para aplicaciones incluidas en ficheros HTML. javadoc: aplicacin para crear documentacin HTML a partir de cdigo Java. jdb: depurador de Java.
Un primer ejemplo:
class Hola { public static void main(String argumentos[ ]) { System.out.println("Hola mundo"); }//Fmain }
Hola mundo
En Java, todo son clases. En un fichero aparecern definidas una o ms clases. Para que un programa (no applet) pueda ejecutarse deber contener un mtodo (funcin) llamado main con la declaracin anterior public static void Para crear el programa anterior bastar a con escribir las lneas anteriores con un editor de texto cualquiera, guardar el fichero con el nombre de la clase que contiene a la funcin main seguido de la extensin java, es decir Hola.java (hay que respetar maysculas y minsculas). Para compilar el programa basta con escribir javac Hola.java y si no existe ningn error se generar un fichero llamado Hola.class que contendr el cdigo binario que puede ser interpretado por la MV Java. Para ejecutarlo basta con poner java Hola. Para que el compilador y la mquina virtual encuentre los elementos necesarios hay que definir dos variables de entorno:
Del ejemplo anterior hay que destacar que el mtodo main siempre se declara de la misma forma, no devuelve ningn valor (void) y tiene como argumentos un objeto de tipo String. La funcin println es la encargada de sacar por el dispositivo de salida estndar la informacin que se le pasa como argumento.
La estructura anterior se crea a partir de datos bsicos de C, cada uno de los elementos que la conforman se denominan
miembros de la estructura. La estructura en si no almacena informacin, slo proporciona el guin para la creacin de variables de tipo ficha_bibliografica. Para definir una variable de tipo ficha bibliografica escribiramos algo como:
struct ficha bibliografica libro;
A partir de ah para acceder a los datos utilizamos el operador '.', el nombre de la variable seguida de un punto y el nombre del miembro. Por ejemplo,
libro.anno_publicacion=2000;
Y si queremos definir funciones que manejen dicha informacin sern funciones comunes de 'C', como por ejemplo:
void introduce_fondo(struct ficha_bibliografica *fondo) { printf("Introduce titulo: "); scanf("%s ",fondo->titulo); if(...) { /* Se chequea la entrada*/ ... }//Ffunc
Ahora podra resultarnos de inters poder almacenar algo ms de informacin dependiendo del tipo de publicacin, por ejemplo, si se trata de un artculo de una revista, adems del ttulo del artculo y de sus autores habra que almacenar el nombre de la revista, sus editores, y las pginas que ocupa dentro de sta. Para ello deberiamos definir una nueva estructura aadiendo dichos campos a la que teniamos definida previamente. Adems para realizar la introduccin de datos deberiamos definir una nueva fucin de
introduccin de fondos. Que ocurrira si en lugar de solo dos tipos de publicaciones dispusieramos de una docena de ellas?, deberiamos definir 12 estructuras 12 versiones de cada funcin de introduccin (y de las que hiciera falta). Eso supone duplicar muchas partes de cdigo, tanto en las estruturas como en las funciones. Esto hace que las aplicaciones sean ms pesadas y su mantenimiento mucho ms costoso, imaginar por ejemplo que tras crear esas 12 estructuras resulta que queremos aadir un campo que no habamos considerado previamente y que debe ir en todas ellas. Obligatoriamente deberemos repasar todas las estructuras y los lugares en donde se utilizan para aadir dicho nuevo miembro de la estructura. Obviamente eso supone un gran trabajo y una gran fuente de errores. Otro problema importante asociado a este desarrollo es el control de datos, no hay forma de evitar que en un momento dado un desarrollador que utiliza nuestras estructuras escriba algo como:
fondo.anno_publicacion=2100; fondo.p ini=-100;
Generando informacin errnea y posibles fuentes de errores posteriores al procesar la informacin. En la programacin orientada a objetos los datos y las funciones que los manejan se encapsula en una entidad denominada clase, mediante la palabra reservada class. El ejemplo anterior utilizando java tomara la forma siguiente:
class ficha_bibliografica {
private char titulo[200]; private char autores[150]; private char editorial[100]; private int anno_publicacion; private char ISBN[12]; void introduce_fondo(){ System.out.println("Introduce titulo"); .. }//Ffun introduce_fondo }
Con la clase anterior los datos referentes a un fondo bibliogrfico as como las funciones que manejan los datos estn juntos. Ahora la funcin introduce_fondo ahora es una funcin miembro o un mtodo de la clase, que se utilizar mediante la sintaxis fondo.introduce fondo(). De forma similar a como se manejan los elementos de una estructura en 'C'. La palabra reservada private delante de la declaracin de las variables hacen que los usuarios de esta clase (estructura mejorada) no puedan manejar directamente las variables de sta, y tengan que recurrir a una serie de funciones definidas en la clase para asignar valores a las distintas variables, pudiendo de esta forma controlar que no se introduzcan valores no vlidos (seguridad). Consideramos ahora, al igual que en el desarrollo anterior, la existencia de artculos de revistas, para ello definimos la clase:
class ficha_bibliografica_articulo extends ficha_bibliografica { char nombre_revista[100]; char editores[200]; int p_ini,p_fin; }
La clase ficha_bibliografica_articulo es una subclase (clase derivada) de ficha bibliografica y hereda todos sus miembros, tanto los datos como los mtodos. En particular podemos definir ficha_bibliografica_articulo articulo; y utilizar la funcin miembro introduce fondo:
articulo.introduce fondo();
Resulta obvio que un planteamiento de este tipo simplifica notablemente el manteniemiento del cdigo, para aadir la variable que contabiliza el nmero de ejemplares bastara con ponerla en la clase base o superclase y automaticamente sera herededada por la subclase. Supongamos ahora que en la clase base hemos definido una funcin que muestra la informacin de un fondo bibliogrfico, est podra ser algo como:
class ficha_bibliografica{ private char titulo[200]; ... private char ISBN[12]; void introduce_fondo() { ... }//Ffunc introduce ... void muestra_informacion() { System.out.println("Titulo: "+titulo); ... System.out.println("ISBN: "+ISBN); }//Ffunc muestra_... }// Fclase
Este mtodo ser heredado por la clase ficha_bibliografica_articulo y podra ser utilizada directamente por parte de un objeto de esta clase sin ms que poner articulo.muestra_informacion(). Sin embargo, su
funcionamiento no sera satisfactorio ya que no muestra todos los datos que contiene la subclase, en particular no muestra el nombre de la revista, ni los editores ni las pginas. Para solucionar el problema podemos redefinir la funcin dentro de la clase derivada:
class ficha_bibliografica_articulo extends ficha_bibliografica { ... ... void muestra_informacion(){ super.muestra_informacion(); System.out.println(";Nombre revista: "+nombre_revista); ... System.out.println("Paginas: ";+p_ini+"-"+p_fin); }//Ffunc muestra_... }
Obsrvese la palabra reservada super, sta se utiliza para referirse a la clase padre de ficha biblio_grafica_articulo e indicar que se utilice la funcin muestra_informacion de la clase padre. Con lo que una llamada a la funcin muestra_informacion de ficha_bibliografica_articulo ejecuta en primer lugar la funcin muestra_informacion de ficha bibliografica y despus completa imprimiendo el nombre de la revista, sus editores y las pginas que ocupa el artculo. Para finalizar comentar que java permite adems la definicin de clases abstractas (no instanciables) y la sobrecarga de funciones (mismo nombre y distintos argumentos). Ademas de las funciones miembro definidas por el diseador de la clase hay dos funciones miembro que siempre estn asociadas a una clase. Su constructor y su destructor. Si no se definen explcitamente se utilizan el
constructor y destructor de defecto. Las primeras tienen el mismo nombre que la clase y las segundas se denominan siempre finalize.
Los datos primitivos no se corresponden con clases y por tanto no disponen de funciones miembro. El API de Java contiene un paquete, java.lang, que contiene clases equivalentes a los datos primitivos adems de gran cantidad de clases diferentes frecuentemente utilizadas. La tabla siguiente contiene informacin de los tipos de datos primitivos: byte short int long float char 8-bit com. a 2 Entero de un byte
16-bit com. a 2 Entero corto 32-bit com. a 2 Entero 64-bit comp. a 2 Entero largo 32-bit IEEE 754 Coma flotante de precisin simple 16-bit carcter Un solo carcter verdadero o falso
double 64-bit IEEE 754 Coma flotante de precisin doble boolean true o false
Sentencias y Comentarios \\ Comentan todo lo que queda a su derecha (comentario de lnea) /* */, se comenta todo lo comprendido entre /* y */, se puede extender todas las lneas que se quieran. /** */, como el anterior pero sirve para generar informacin mediante javadoc.
Las sentencias en Java finalizan por medio de ; y los bloques de cdigo se definen y delimitan por medio de { y }. Los ficheros de cdigo fuente de Java slo pueden tener tres tipos de sentencias que se sitan fuera de cualquier bloque de cdigo. stas son las sentencias package, import y class. Las dos primeras son opcionales y en el caso de aparecer debe respetarse el orden en el que se han mostrado. La sentencia package da nombre al paquete al que pertenecern las clases que se definan en este fichero. La sentencia import sirve para refererirse de una forma ms corta a un determinado conjunto de clases y finalmente por medio de la palabra class se definen nuestras clases. Identificadores y literales Los identificadores en Java deben comenzar por un carcter alfabtico y pueden contener posteriormente cualquier cantidad de carcteres y dgitos. byte,short,int Dgitos decimales que no empiecen por Ox (seguido de dgitos hexadecimales) o por O (seguido de digitos octales) long float double boolean char Igual que los anteriores pero seguidos del carcter L Dgitos con punto decimal y/o exponente seguidos del carcter F Como float pero sin el sufijo F true o false Cualquier carcter ASCI/UNICODE entre
Los datos de tipo String no son primitivos, corresponden a la clase del mismo nombre. Operadores Aritmticos Operador Uso + * / % ++ ++ -op1 + op2 op1 op2 op1 * op2 op1 / op2 op1 % op2 -op op++ ++op op- Descripcin Suma op1 y op2 Resta op2 de op1 Multiplica op1 y op2 Divide op1 por op2 Resto de dividir op1 por op2 cambio de signo Incrementa op en 1; evala el valor antes de incrementar Incrementa op en 1;evala el valor despus de incrementar Disminuye op en 1;evala el valor antes de disminuir
--
- -op
op1 > op2 op1 es mayor que op2 op1 >= op2 op1 es mayor o igual que op2 op1 < op2 op1 es menor que op2 op1 <= op2 op1 es menor o igual que op2 op1 == op2 op1 y op2 son iguales op1 != op2 op1 y op2 son distintos
Operadores Relacionales Operador Uso & && | || ! op1 & op2 op1 | op2 op1 || op2 !op Devuelven true cuando op1 y op2 son verdaderos uno de los dos es verdadero uno de los dos es verdadero op es falso
La diferencia entre & y && es que el primero comprueba siempre las dos condiciones op1 y op2, mientras que && si encuentra que op1 es falsa entonces ya no comprueba op2 puesto que el resultado de la expresin siempre ser falso. El comportamiento de || es similar, si op1 es cierto ya no se
comprueba op2 ya que el resultado de la evaluacin siempre ser cierto. Operadores de bits Op. Uso Descripcin
>> op1 >> op2 desplaza a la dcha op2 bits de op1 << op1 << op2 desplaza a la izda op2 bits de op1 >>> op1 >>> op2 & | ^ ~ op1 & op2 op1 | op2 op1^op2 ~ op desp. a dcha op2 bits de op1(sin signo) bitwise and bitwise or bitwise xor bitwise complemento
Las variables numricas en Java siempre son con signo, los operadores de desplazamiento habituales >> y << actan moviendo los bits del entero correspondiente pero respetando el signo. Para desplazar todos los bits ignorando el hecho de que uno de ellos corresponde al signo se utiliza el operador >>>. Operadores de asignacin Operador Uso += -= = op1 + = op2 op1 - = op2 op1 = op2 Descripcin op1 = op1 + op2 op1 = op1 - op2 op1 = op1 * op2
op1 = op1 / op2 op1 = op1 & op2 op1 = op1 | op2 op1 = op1^op2
op1 <<= op2 op1 = op1 << op2 op1 >>= op2 op1 = op1 >>op2 op1 >>>= op2 op1 = op1 >>> op2
Operador de conversin El operador de conversin o casting se utiliza para convertir un tipo de dato en otro, su sintaxis es anloga a la de C y C++.
(tipo nuevo) variable_de_otro_tipo
Precedencia de operadores operadores sufijo creacin o tipo multiplicadores suma/resta desplazamiento relacionales igualdad [] . (parntesis) new (type)expr */% +<<, >>, >>> >, <, <=, >=, instanceof == !=
bitwise AND bitwise exclusive OR bitwise inclusive OR AND lgico OR lgico condicional asignacin
& ^ | && || ?: =, +=, -=, *=, /=, %=, ^=, &=, |=, <<=, >>=, >>>=
Arrays En java los arrays se declaran mediante la utilizacin de [], por ejemplo:
char s[]; int vector[];
y despus se le asigna memoria por medio del operador new, por ejemplo:
s=new char[50]; vector = new int[100];
ciudades[0]= "Zaragoza"; // ciudades[0]= new String("Zaragoza"); ciudades[1]="Huesca"; // ciudades[1]= new String("Huesca"); ciudades[2]="Teruel"; // ciudades[2]= new String("Teruel");
e incluso pueden definirse matrices cuyo nmero de elementos en cada fila sea diferente:
int matriz[][]; matriz = new int[3][]; matriz[0]= new int[2]; matriz[1]= new int[3]; matriz[2]= new int[4];
Los arrays disponen de un miembro, length que proporciona el nmero de posiciones del array.
matriz.length; // proporcionaria un valor de 3 matriz[2].length;// proporcionaria un valor de 4
Si en la declaracin se omite la clasula extends se toma por defecto que extiende a la clase object superclase de la que derivan todas las clases. Si en la declaracin se indica que la clase implementa, implements, algn interfaz entonces deber implementar todos los miembros de dicho interfaz. Las variables miembro se declaran en la forma siguiente:
[modificadores] identificador_tipo_de_dato identificador;
Los modificadores especifican la visibilidad, accesibilidad y existencia de la variable, el identificador_tipo_de_dato corresponde a un tipo de dato primitivo o uno definido por el usuario. Las funciones miembro admiten una formulacin general como: modificadores tipo_resultado identificador(lista_de_argumentos) { ... cuerpo de la funcion... } tipo_resultado es el tipo devuelto por la funcin y puede ser cualquier tipo base o tipo definido por el usuario, incluido el tipo void que se utiliza para indicar que la funcin no devuelve nada. lista_de_argumentos es una lista de declaraciones de variables separadas por comas.
El inicializador de clase es un cdigo que la mquina virtual ejecuta nicamente al cargar la clase, su estructura es:
static { ... codigo del proceso de inicilizacion... }
Ejemplo Segundo
Reglas de mbito Un mbito es un bloque de cdigo encerrado entre { y }. La existencia de las variables se conoce nicamente dentro del mbito en la que se definen (y dentro de mbitos contenidos en ste). En particular las variables de una funcin son conocidas nicamente dentro de dicha funcin (puesto que la definicin/implementacin de la funcin se realiza en el mbito que sigue al nombre de dicha funcin) En el ejemplo siguiente siguiente la variable i es accesible desde dentro de las dos funciones (ya que se encuentran dentro del mbito en donde se defini). k slo es accesible desde funcion1() y su intento de utilizacin en funcion2() generar un error. Finalmente, las dos variables j son diferentes e independientes, cada una se conoce nicamente en su funcin.
class MiClase { int i; int funcion1() { int j; int k; i=6; ... } int funcion2()
Modificadores Un modificador es una palabra reservada que sirve para indicar cuando existe o cuando y por quien es accesible una clase, funcin o variable. Si no se indica nada una clase es visible en todas las clases declaradas en el mismo paquete, si no se indica ningn paquete es visible en el paquete por defecto, el paquete al que pertenecen todas las clases que no declaran un paquete. Modificadores public, protected, private Por defecto una clase y sus miembros slo son conocidas por las otras clases que se encuentran dentro de un mismo paquete. El modificador public sobre una clase provoca que la clase pueda ser utilizada por objetos que estn fuera del paquete actual, bien directamente o por herencia. Para acceder desde distintos paquetes basta con importar la clase. Sobre un miembro de una clase (funcin o variable), indica que dicho miembro es accesible desde cualquier sitio. Los siguientes dos modificadores slo son utilizables sobre miembros. El modificador protected es el siguiente en orden creciente de restriccin. Los miembros con este modificador son accesibles desde la propia clase a la que pertenecen y desde las clases y subclases del mismo paquete. Si se
declaran subclases en otros paquetes sern accesibles nicamente desde el interior de las subclases. Este nivel de acceso se utiliza cuando es apropiado para una subclase de la clase tener acceso a los miembros, pero no as para las clases no relacionadas con ellas (ni por herencia ni por pertenencia al mismo paquete). El modificador private es el de nivel de acceso ms restringido. Un miembro privado es accesible slo para la clase en la que est definido. Se utiliza este acceso para declarar miembros que slo deben ser utilizados por la clase.
Ejemplo tercero
Modificador final El modificador final se utiliza para hacer referencia a elementos constantes. Al definir una variable local o miembro con el modificador final dicha variable no puede alterar su valor (y por tanto debe inicializarse en la definicin). Cuando se utiliza el modificador final sobre una funcin miembro dicha funcin no puede redefinirse en subclases de su clase y, si se utiliza sobre una clase dicha clase no puede derivarse para crear subclases.
Ejemplo cuarto Ejemplo quinto
Modificador abstract El modificador abstract sobre una clase indica que sta no puede materializarse (no pueden crearse objetos a partir de
ella). Una clase abstracta es una clase que se utiliza para crear subclases. Un mtodo declarado abstract no se implementa en la clase sino en alguna clase derivada. Si una clase contiene mtodos abstract obligatoriamente debe declararse abstract.
Ejemplo sexto Ejemplo sptimo
Modificador static Normalmente cuando se crea un objeto de un cierta clase ste recibe una copia propia de todas las variables miembro de la clase. Sin embargo, es posible hacer que alguna variable miembro sea comn a todos los objetos definidos de la clase. Dichas variables se denominan estticas y se declaran mediante el modificador static. Al igual que variables miembro se pueden declarar mtodos estticos, sto evita que el mtodo pueda acceder a las variables de instancia no estticas, es decir, los mtodos estticos slo pueden actuar sobre variables estticas. Cuando se accede a una variable o miembro esttico puede hacerse por medio de la clase o por medio del objeto de la clase. Este modificador no acta sobre las clases.
Ejemplo octavo Ejemplo noveno Ejemplo noveno (bis)
Modificador synchronized Este modificador acta nicamente sobre funciones miembro y evita que una funcin pueda ser utilizada simultneamente por varios objetos.
Modificador native Este modificador se utiliza para declarar funciones implementadas externamente en otros lenguajes como C y C++. Dichas funciones carecen de cdigo en el programa Java. Este modificador acta al igual que el anterior sobre funciones miembro. Modificador volatile Este modificador acta nicamente sobre variables e indica a la mquina virtual que el valor de dicha variable puede modificarse independientemente del proceso en curso, es decir, puede ser modificado por otros subprogramas. La siguiente tabla le muestra los niveles de acceso permitidos por cada modificador de los comentados anteriormente Especificador clase subclase paquete private protected public package X X X X X* X X X X X mund o
La primera columna indica si la propia clase tiene acceso al miembro definido por el especificador de acceso. La segunda columna indica si las subclases de la clase (sin importar dentro de que paquete se encuentren estas) tienen acceso a los miembros. La tercera columna indica si las clases del
mismo paquete que la clase (sin importar su parentesco) tienen acceso a los miembros. La cuarta columna indica si todas las clases tienen acceso a los miembros.
Sobrecarga de funciones
Java soporta la sobrecarga de funciones, esto es, distintas funciones que comparten el mismo nombre, basta para ello con tener distintos argumentos de llamada.
Ejemplo dcimo
, constructores definidos (al tratarse de un mtodo ms el constructor puede sobrecargarse) Para inicializar un objeto basta con llamar a su constructor despus de la palabra reservada new y asignarlo a una referencia declarada previamente. Un destructor es un mtodo de clase que sirve para realizar ciertas operaciones necesarias al dejar de existir un objeto, por ejemplo, cerrar conexiones de una comunicacin, cerrar ficheros, etc. Java dispone de un elemento denominado recolector de basura (garbage collector) que se encarga de liberar memoria asignada a objetos que ya no se utilizan, an as en ocasiones ser necesario disponer de una funcin que realice operaciones adicionales a la mera liberacin de memoria. Para este fin se crea un mtodo, denominado finalize, con las siguientes caractersticas:
protected void finalize() throws throwable { ... cuerpo del destructor }
El significado de la ltima parte de la declaracin se estudiar ms adelante, de momento basta con saber que dicha funcin debe tener ese prototipo. this y super En ocasiones las variables locales de una funcin miembro de un objeto pueden tener el mismo nombre que algunas variables miembro del objeto, o las variables miembro de
una clase pueden tener el mismo nombre que algunas de las variables miembro de su clase padre. Por medio de la palabra reservada this tenemos una referencia al objeto que ha llamado a un determinado mtodo, y nos permite de esta forma referirnos a las variables miembro del objeto. Por otro lado con super podemos acceder a los miembros definidos en la clase padre. Cuando se trabaja sobre los constructores el significado de estas palabras reservadas es diferente. Dentro de un constructor la llamada a this realiza a una llamada del constructor de la clase sin argumentos o al constructor existente cuyos argumentos encajen con los suministrados con this. La palabra reservada super cuando se llama dentro del constructor de una subclase lo que hace es llamar al constructor correspondiente de la clase padre.
Ejemplo undcimo Ejemplo Duodcimo
La sentencia import se utiliza para especificar los paquetes en los que se encuentran las clases a las que se referir el resto del programa. La existencia de los paquetes junto con los distintos tipos de acceso permiten disear distintas polticas de seguridad. Su sintaxis es:
import nombre_paquete(s); // admite comodines *
Gracias a la existencia de los paquetes dos clases pueden tener el mismo nombre, siempre y cuando se encuentren en paquetes diferentes. Para su utilizacin bastar con anteponer el nombre del paquete seguido de un punto antes del nombre de la clase. Los paquetes pueden anidarse formando una jerarqua y para referirse a un clase dentro de un paquete que esta incluido en otros basta con anteponer al nombre de la clase la trayectoria de paquetes hasta el paquete final separados por puntos. Cada paquete debe corresponder con un directorio del mismo nombre en el sistema de ficheros. Los paquetes anidados se reflejan en la jerarqua del sistema de ficheros por medio de directorios contenidos en otros directorios. Para indicarle a la mquina virtual a partir de donde buscar los directorios que contienen las clases se define una variable de entorno llamada CLASSPATH a la que se le asigna como valor el o los directorios raiz de los cuales cuelgan los directorios de clases. Si una clase de un paquete se declara como pblica debe ir sla en un fichero con el mismo nombre.
Ejemplo decimotercero
Ejemplo decimocuarto
Para que un mtodo pueda lanzar una excepcin hay que indicarlo en su declaracin y despus lanzarla cuando se produzca el error considerado. Para indicar las excepciones que puede lanzar un mtodo se utiliza la palabra reservada throws y para lanzar la excepcin es necesario crear un
objeto de tipo Exception o de alguna de sus subclases y utilizar la palabra reservada throw. La sintaxis de la indicacin del lanzamiento de excepciones por parte de un mtodo es:
declaracion_de_metodo() throws lista_excepciones { ... cuerpo del metodo }
Y en el cuerpo del mtodo, si la excepcin la ha definido el usuario, debe aparecer en el punto en el que se detecta la situacin anmala la palabra reservada throw seguida de un objeto de la clase Throwable o de alguna de sus subclases (Exception, error, etc.)
Ejemplo decimosptimo
Para definir y manejar (capturar) excepciones creadas por el programador se utilizan los manejadores de excepciones que se definen por medio de tres bloques de sentencias encabezadas por las palabras reservadas try, catch y finally. Lo primero que hay que hacer para que un mtodo sea capaz de tratar una excepcin generada por la mquina virtual Java o por el propio programa mediante una instruccin throw es encerrar las instrucciones susceptibles de generarla en un bloque try. A continuacin del bloque try deben aparecer uno o ms bloques encabezados por sentencias catch que capturan posibles excepciones e indican como manejarlas. Finalmente puede aparecer, no es obligatorio, un bloque encabezado por la sentencia finally, las instrucciones
contenidas en dicho bloque se ejecutarn se produzca o no una excepcin en el bloque try. La sintaxis del tratamiento de excepciones queda:
try { ... bloque de instrucciones... } catch(TipodeExcepcion variable) { ... bloque de instrucciones ... } catch(TipodeExcepcion variable) { ... bloque de instrucciones ... } ... catch(TipodeExcepcion variable) { ... bloque de instrucciones ... } finally { ... bloque de instrucciones ... }
Obsrvese que en cada setencia catch aparece la declaracin de un tipo de excepcin que es la que indica que excepcin debe manejar dicho bloque.
Ejemplo decimoctavo
Cuando se lanza una excepcin, la mquina virtual recorre la pila de llamadas de mtodos en busca de alguno que sea capaz de tratar la clase de excepcin lanzada. Para ello, comienza examinando el mtodo donde se ha producido la
excepcin. Si este mtodo no es capaz de tratarla, examina el mtodo desde el que se realiz la llamada al mtodo donde se produjo la excepcin y as sucesivamente hasta llegar al ltimo de ellos. En caso de que ninguno de los mtodos de la pila sea capaz de tratar la excepcin, la mquina virtual Java muestra un mensaje de error y el programa termina.
La construccin de subprocesos, threads, puede realizarse de dos formas, por medio de de la declaracin de una subclase de la clase Thread o declarando una clase que implemente el
interface Runnable. Nos centraremos en el primer mtodo ya que resulta ms sencillo. La subclase definida debe definir (en realidad, redefinir) un mtodo pblico que no devuelve nada (void) llamado run, en el que se incorporan las acciones a realizar. Para lanzar el subproceso se llama al mtodo start de la clase padre el cual se encargar de llamar a nuestra funcin run. Cuando se instancia un Thread ( o una clase derivada suya) ste se inicializa sin asignrsele recursos, en esta situacin slo admite las llamadas del mtodo start() y stop(). La llamada al mtodo start() asigna los recursos necesarios para ejecutar el subproceso y llama al mtodo run(), y el subproceso pasa a estar en estado ejecutable. Un Thread puede pasar de estado ejecutable a no ejecutable por la invocacin on de los mtodos sleep(), suspend(), wait(), o porque el Thread este bloqueado por una operacin de entrada/salida. Un Thread puede pasar al estado muerto por dos motivos, que finalice normalmente el mtodo run() o por que se llame al mtodo stop(), desde cualquiera de sus estados. Finalmente un Thread pasa del estado no ejecutable a ejecutable en los siguientes casos. Si estaba dormido (por una llamada previa a la funcin sleep() pasar a ejecutable tras transcurrir el tiempo indicado en la llamada a sleep(). Si estaba suspendido por una llamada previa a suspend() pasar a a ejecutable por medio de una llamada a la funcin resume(). Si el proceso estaba esperando, por una llamada previa a la funcin wait() pasar a ejecutable por medio de una llamada a la funcin notify() o notifyall(). Y si est
bloqueado por una operacin de entrada/salida, pasar a a ejecutable cuando finalice dicho bloqueo. A continuacin se muestran diversos mtodos de la clase Thread. 1. public static Thread currentThread() devuelve el thread que se est ejecutando en ese momento. 2. public final boolean isAlive() devuelve false si el thread est en estado nuevo o muerto y true en cualquier otro caso. 3. public static void sleep(long milisegundos) throws InterruptedException y public static void sleep(long milisegundos,int nanosegundos) throws InterruptedException Hacen que el thread pase de estado ejecutable a estado dormido y permanezca en dicho estado durante los milisegundos o, milisegundos ms nanosegundos indicados. Tras dicho tiempo el thread pasa nuevamente a estado ejecutable. Si el thread recibe el mtodo interrupt() se lanza la excepcin InterruptedException. 4. public final void suspend() pasa un thread de estado ejecutable a suspendido. Para reanudar el thread hay que llamar al mtodo resume(). 5. public final void wait() throws InterruptedException, public final void wait(long milisegundos) throws InterruptedException y public
final void wait(long milisegundos,int nanosegundos) throws
Este mtodo pasa el thread al estado esperando y permanece en dicho estado durante el tiempo indicado por los argumentos, segundo y tercer caso, o hasta que recibe el mtodo notify() (notifyall()). 6. public static void yield() Transfiere el control al siguiente thread en el scheduler que se encuentre en estado ejecutable y que tenga la misma prioridad que el actual.
InterruptedException
7. public final void join() Hace que el thread que se est ejecutando, incluido el main, pase al estado esperando hasta que muera el thread que invoc a la funcin join().
Ejemplo decimonoveno Ejemplo vigsimo Ejemplo vigsimoprimero