You are on page 1of 39

<>\ tarea MODIFICADORES0 :0 MODIFICAR 0CADA 0UNO 0DE0 LOS 0OBJETOS SELECTORES: CONSTRUCTORES Encepsulamiento Diferencia entre &&

y & ___________________________________________________ Programa.O.Objetos. Nombre Apellidos Edad Carrera Ciclo

Alumno=new array(juan,perez,17,informtica,cicloI)

Registro Registro TAlumno

LICENCIATURA EN MATEMTICAS INTRODUCCIN A LA PROGRAMACIN CON JAVA 2002/2003

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.

Cmo trabaja JAVA?


Java utiliza un compilador para generar cdigo ejecutable. A diferencia de los compiladores habituales que generan el cdigo para un procesador en particular, JAVA genera un cdigo binario independiente de la plataforma. Para ejecutar dichos cdigos se utiliza una Mquina Virtual

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:

Abstraccin Encapsulacin Herencia Polimorfismo

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.

Kit de Desarrollo JDK de SUN


Aunque muchos programadores utlizan otros entornos de desarrollo el Kit de Desarrollo de Java, JDK, aun se considera como la implementacin de referencia. Por tanto, si funciona bajo el JDK con gran probabilidad funcionar en otras implementaciones (como por ejemplo la MV de algunos navegadores). El JDK consta de las librerias de clases standar y un conjunto de utilidades:

javac: compilador de Java

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:

set CLASSPATH = C:\JAVA\LIB; . set PATH = "\%PATH%;C:\JAVA\BIN"

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.

Introduccin a la Programacin Orientada a Objetos


Para realizar una primera aproximacin a un objeto podemos pensar en las estructuras y registros utilizados en algunos lenguajes de programacin. Con dichos elementos se construyen variables que bajo un nombre comn recogen informacin heterognea. Para ilustrar esta introduccin consideramos una situacin hipottica en la que debemos construir un gestor de fondos de una biblioteca, necesitaramos inicialmente los elementos siguientes.
struct ficha_bibliografica{ char titulo[200]; char autores[150]; char editorial[100]; int anno_publicacion; char ISBN[12]; }

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.

Palabras reservadas, tipos de datos, modificadores y expresiones


Las palabras reservadas en Java son: abstract double int strictfp boolean else interface super break extends long switch byte final native synchronized case finally new this catch float package throw char for private throws class goto protected transient const if public try continue implements return void default import short volatile do instanceof static while null true/false Los Tipos de datos se pueden clasificar en tres tipos: a) Tipos de datos primitivos (integrados en el lenguaje). b) Clases del sistema que se definen en la API de Java. c) Clases de usuario.

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

comillas simples String Secuencia de carcteres o secuencias de escape entre comillas

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

Disminuye op en 1;evala el valor despus de disminuir

Operadores lgicos Operador Uso > >= < <= == != Descripcin

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

op1 && op2 op1 y op2 son verdaderos

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 / = op2 op1 &= op2 op1 | = op2 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 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 == !=

operadores unarios ++expr - -expr +expr -expr ~!

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];

Tambin puede declararse y definirse simultaneamente


String ciudades[] = {"Zaragoza", "Huesca", "Teruel"};

Que sera equivalente a


String ciudades[]; ciudades = new String[3];

ciudades[0]= "Zaragoza"; // ciudades[0]= new String("Zaragoza"); ciudades[1]="Huesca"; // ciudades[1]= new String("Huesca"); ciudades[2]="Teruel"; // ciudades[2]= new String("Teruel");

Tambin pueden definirse arrays de arrays,


int matriz[][]; matriz = new int[3][5];

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

Declaracin de clases, reglas de mbito, modificadores de almacenamiento, perdurabilidad y accesibilidad.


Declaracin de clases La declaracin completa de una clase es:
[modificadores] class Nombre_de_Clase [extends Nombre_de_Superclase] [implements lista_de_Interfaces] { declaracion_de_variables_miembro; declaracion_de_funciones_miembro; inicializador_de_clase; ...

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()

{ int j; k=3; //Error al compilar i=7; ... } ... }

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 y destructores. this y super


Constructores y destructores Un constructor es un mtodo de una clase que sirve para inicializar un objeto. Es una funcin que se ejecuta siempre al crear un objeto. Los constructores de una clase tienen siempre el nombre de la clase y no tiene ningn valor devuelto (ni siquiera void). Si el usuario no declara un constructor el sistema siempre crea un constructor por defecto sin argumentos. En el momento en el que el usuario define un constructor el constructor del sistema se elimina y es sustituido por el, o los

, 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

Paquetes: package e import


Un paquete, package, es una coleccin de clases e interfaces relacionadas. Mediante la orden package situada al principio del fichero se especifica el paquete al que pertenecen las clases e interfaces que se van a construir en dicho fichero. Su sintaxis es:
package nombre_paquete;

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

Interfaces: interface, implements


Un interfaz se puede definir como una clase con todos sus mtodos abstractos y sus variables constantes. Por defecto todos sus mtodos son public y abstract y todas sus variables final, public y static. Cuando una clase declara una lista de interfaces hereda de stos sus constantes y debe definir todos los mtodos declarados en ellos. La declaracin de un interfaz se realiza: [public] interface nombre_interfaz [extends lista_super_interfaces] { ... Cuerpo del interfaz } El modificador public hace que el interfaz sea accesible por cualquier clase en cualquier paquete, sino slo ser accesible por las clases definidas en el mismo paquete que el interfaz. Un interfaz puede derivarse de varios interfaces, no nicamente de uno tal y como ocurre con la derivacin de clases. Para que una clase implemente (utilice) uno o ms interfaces se utiliza la palabra reservada implements, tal y como se mostr en la declaracin de clases. Al igual que en el caso de derivacin de interfaces, una clase puede

implementar varios interfaces distintos. La lista de interfaces se separa con comas.


Ejemplo decimoquinto Un inciso, las clases String, StringBuffer,System.

Tratamiento de excepciones: try, catch, throw, throws


Una excepcin es una situacin anmala que interrumpe el flujo de un programa, por ejemplo, un archivo que se va a abrir y no existe, el acceso a posiciones de un vector mas all de sus lmites, una divisin por cero, etc. Dichas excepciones pueden originarse de dos formas, bien por que el programa hace algo ilegal (situacin habitual) o bien por que el programa genera de una forma explcita el tratamiento de una situacin de error. Muchas de las situaciones de excepcin previsibles estn contempladas directamente por la mquina java, pero aun as, desde nuestro programa podemos utilizar dichas situaciones ya definidas, modificar dichas situaciones definiendo nuevos tratamientos y, generar nuevas excepciones.
Ejemplo decimosexto

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.

Un inciso, las clases File y RandomAccessFile

Mltiples subprocesos: Threads


Un thread es un subproceso que se ejecuta dentro de un proceso (programa) padre. Un programa puede contener varios subprocesos que se ejecutan en paralelo.
class mithread extends Thread { public void run() { int i; for(i=0;i<=20;i++) System.out.println("Mi thread"); } } class un_thread { public static void main(String[] arg) { int i; mithread t = new mithread(); t.start(); for (i=1;i<=20;i++) System.out.println("Main"); } }

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

You might also like