Professional Documents
Culture Documents
Java es OO
Todas las funciones estn asociadas a objetos Casi todos los tipos de datos son objetos
Files, arrays, strings, sockets, etc Mantiene tipos de datos "simples"
byte, short, int, long, float, char, boolean
Versiones de Java
Java 1.0 es lanzado en 1995 Java 1.1 es lanzado a mediados de 1997
Un nuevo modelo con un manejo basado en listeners RMI y serializacin de objetos Soporte para clases internas y annimas Alta precisin en las operaciones aritmticas JDBC JavaBeans Firmas digitales en applets
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Versiones de Java
Java 2 Platform es lanzado en Dic 1998 Estndar Edition (JDK 1.2)
Componentes GUI Swing basados 100% en Java Java 2D Soporte de estructuras de datos complejas Soporte de diversos formatos de audio Impresin de objetos grficos CORBA
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Versiones de Java
JDK 1.3 es lanzado en primavera del 2000
Caractersticas principales
JNDI RMI-IIOP
Archivo holamundo.java
public class holamundo { public static void main(String [] args) { System.out.println("Hola Mundo"); } }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Ejecucin
java holamundo
Resultado
Hola Mundo
Archivo ShowArgs.java
public class ShowArgs { public static void main(String[] args) { for (int i=0; i<args.length; i++) { System.out.println("Arg " + i + " es " + args[i]); } } }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Resultados
Arg Arg Arg Arg 0 1 2 3 es es es es uno dos tres cuatro
Nomenclatura de la POO
"Clase" significa una categora de cosas
Una clase puede ser usada como un tipo de un campo, una variable local o para especificar el valor de retorno de una funcin
Ejemplo1
Variables e Instancias
class Ruta1 { public double x, y, speed, direction; public String name; } public class Test1 { public static void main(String[] args) { Ruta1 s1 = new Ruta1(); s1.x = 0.0; s1.y = 0.0; s1.speed = 0.0; s1.direction = 0.0; //Este s1.name = "Ruta1"; Ruta1 s2 = new Ruta1(); s2.x = 0.0; s2.y = 0.0; s2.speed = 2.0; s2.direction = 135.0; //Noroeste s2.name = "Ruta2"; ...
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Ejemplo1
Variables e Instancias
... s1.x = s1.x + s1.speed * Math.cos(s1.direction * Math.PI / 180.0); s1.y = s1.y + s1.speed * Math.sin(s1.direction * Math.PI / 180.0); s2.x = s2.x + s2.speed * Math.cos(s2.direction * Math.PI / 180.0); s2.y = s2.y + s2.speed * Math.sin(s2.direction * Math.PI / 180.0); System.out.println(s1.name + " esta en (" + s1.x + "," + s1.y + ")."); System.out.println(s2.name + " esta en (" + s2.x + "," + s2.y + ")."); } }
Ejemplo1
Resultados Compilando y ejecutando
javac Test1.java java Test1
Resultados
Ruta1 esta en (1,0). Ruta2 esta en (-1.41421,1.41421).
Ejemplo1
Puntos clave Convenciones de nombrado Formato de la definicin de las clases Crear objetos con "new" Acceso a las propiedades con "objeto.propiedad"
Convenciones de nombrado
Utilice maysculas en la primera letra de la clase
public class MyClass {
Objetos y referencias
Cuando una clase es definida, puede declarar fcilmente variables utilizando esa clase
Ruta ruta1,ruta2; Point start; Color blue;
Ejemplo2
Mtodos
class Ruta2 { public double x=0.0, y=0.0, speed=0.0, direction=0.0; public String name="SinNombrar"; private double gradosAradianes(double grados) { return ( grados * Math.PI / 180.0 ); } public void move() { double angulo = gradosAradianes(direction); x = x + speed * Math.cos(angulo); y = y + speed * Math.sin(angulo); } public void printLocation() { System.out.println(name + " esta en (" + x + "," + y + ")."); } }
Ejemplo2
Mtodos
public class Test2 { public static void main(String[] args) { Ruta2 s1 = new Ruta2(); s1.name = "Ruta1"; Ruta2 s2 = new Ruta2(); s2.speed = 2.0; s2.direction = 135.0; //Noroeste s2.name = "Ruta2"; s1.move(); s2.move(); s1.printLocation(); s2.printLocation(); } }
Ejemplo2
Puntos clave Formato de la definicin de los mtodos Mtodos que accesan los campos locales Llamada a mtodos Mtodos estticos Valores por defecto a los campos Definiciones publicas y privadas
Definicin de mtodos
Funciones dentro de clases
Declaracin de un mtodo sencillo:
public returnType methodName( type1 arg1, type2 arg2, ...) { ... return (valor de returnType); }
Excepcin de la regla: cuando el tipo de retorno es void En este caso, la sentencia return no requiere regresar ningn valor.
Definicin de mtodos
Ejemplos
Considere los siguientes dos ejemplos
El primero, eleva al cuadrado un entero El segundo, regresa el ms veloz de dos objetos Ruta, asumiendo que en la clase Ruta se ha definido un campo llamado velocidad
// Ejemplo de la llamada: // int val = square(7); public int square(int x) { return ( x * x ); } //Ejemplo de la llamada: // Ruta masrapida = masRapida(ruta1,ruta2) public Ruta masRapida(Ruta r1, Ruta r2) { if (r1.velocidad > r2.velocidad) { return(r1); } else { return(r2); } }
Llamada a mtodos
El trmino "mtodo" puede explicarse como "una funcin asociada a un objeto"
La forma ms usual de llamar un mtodo es la siguiente:
objectName.methodName()
Por ejemplo, la clase String tiene un mtodo llamado toUpperCase que regresa la cadena en maysculas
El mtodo no requiere argumentos
String s1 = "Hola"; String s2 = s1.toUpperCase(); // s2 es "HOLA"
Llamada a mtodos
Existen dos formas distintas de realizar llamadas a mtodos:
Cuando se llama a un mtodo dentro de la definicin de la clase Mtodos declarados como static
Mtodos estticos
Los mtodos estticos no requieren accesar a campos dentro de la clase Su comportamiento es similar a las funciones globales en otros lenguajes
ClassName.functionName(arguments);
Por ejemplo, la clase Math tiene un mtodo llamado cos que requiere un argumento de tipo double
Puede realizar la llamada al mtodo Math.cos sin que e requiera crear un objeto de la clase Math
Visibilidad
Mtodos pblicos y privados
Una declaracin de un mtodo private significa que este no puede ser llamado desde fuera de la declaracin de la clase Utilice la declaracin public para los mtodos que realmente deben estar disponibles a los usuarios Puede cambiar o eliminar mtodos privados sin afectar a los otros usuarios.
Variables en mtodos
Cuando declara una variable dentro de un mtodo, la declaracin se ve como la siguiente:
Type varName = value;
Variables en mtodos
Ejemplos
int x = 3; int y = x; // Sintaxis para crear un objeto String String s1 = "Hello"; // Sintaxis String s2 = String s3 = String s4 = normal para crear objetos new String("Adios"); s2; s3.toUpperCase();
// Resultado: s4 es "ADIOS" // Se asume que el mtodo findFastestShip ha sido declarado // y que regresa un objeto Ship ship1 = new Ship(); Ship ship2 = ship1; Ship ship3 = findFastestShip();
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Ejemplo3
Constructores
class Ruta3 { private double x, y, speed, direction; private String name; public Ruta3(double x, double y, double speed, double direction, String name) { this.x = x; // "this" diferencia las variables de this.y = y; // instancia de las variable locales. this.speed = speed; this.direction = direction; this.name = name; } private double degreesToRadians(double degrees) { return(degrees * Math.PI / 180.0); } Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java ...
Ejemplo3
Constructores
public void move() { double angle = degreesToRadians(direction); x = x + speed * Math.cos(angle); y = y + speed * Math.sin(angle); } public void printLocation() { System.out.println(name + " is at (" + x + "," + y + ")."); } } public class Test3 { public static void main(String[] args) { Ruta3 s1 = new Ruta3(0.0, 0.0, 1.0, 0.0, "Ship1"); Ruta3 s2 = new Ruta3(0.0, 0.0, 2.0, 135.0, "Ship2"); s1.move(); s2.move(); s1.printLocation(); s2.printLocation(); } }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Ejemplo3
Constructores Compilando y ejecutando:
javac Test3.java java Test3
Salida:
Ship1 is at (1,0). Ship2 is at (-1.41421,1.41421).
Ejemplo3
Puntos clave Formato de la definicin de constructores La referencia "this"
Constructores
Los constructores son funciones especiales que son llamadas cuando una clase es creada con new
Los constructores son especialmente tiles para proporcionar valores a los campos Los constructores son declarados como
public ClassName(args) { ... }
Observe que el nombre del constructor debe ser igual que el nombre de la clase No retornan ningn valor y no requieren la palabra clave void, como los mtodos regulares Java automticamente provee de un constructor sin argumentos para todas las clases
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
La variable this
El nombre this es usada dentro de mtodos no estticos para referirse al objeto actual Los usos ms comunes de la referencia this son las siguientes:
Para pasar la referencia del objeto actual como un parmetro a otro mtodo someMethod(this); Para resolver conflictos de nombres
Su uso permite diferenciar variables locales de variables de instancia con el mismo nombre
Ejemplo4
Overloading
class Ruta4 { private double x=0.0, y=0.0, speed=1.0, direction=1.0; private String name; public Ruta4(double x, double y, double speed, double direction, String name){ this.x = x; this.y = y; this.speed = speed; this.direction = direction; this.name = name; } public Ruta4(String name){ this.name = name; } private double degreesToRadians(double degrees) { return(degrees * Math.PI / 180.0); }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Ejemplo4
Overloading
... public void move() { move(1); } public void move(int steps) { double angle = degreesToRadians(direction); x = x + (double)steps * speed * Math.cos(angle); y = y + (double)steps * speed * Math.sin(angle); } public void printLocation() { System.out.println(name + " is at (" + x + "," + y + ")."); } }
Ejemplo4
Overloading
public class Test4 { public static void main(String[] args) { Ruta4 s1 = new Ruta4("Ship1"); Ruta4 s2 = new Ruta4(0.0, 0.0, 2.0, 135.0, "Ship2"); s1.move(); s2.move(3); s1.printLocation(); s2.printLocation(); } }
Compilando y ejecutando:
javac Test4.java java Test4
Salida:
Ship1 is at (1,0). Ship2 is at (-4.24264,4.24264).
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Overloading
Puntos claves
Permite la definicin de mas de un mtodo o constructor con el mismo nombre
Las funciones sobrecargadas pueden diferir en el numero y tipo de argumentos. Java decide que constructor o mtodo es el apropiado
Ejemplos
Los siguientes son dos mtodos square que se diferencian por el tipo de dato del argumento
// square(4) es 16 public int square(int x) { return (x*x); } // square("dos") es "dos dos" public string square(String s) { return (s + " " + s); }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Ejemplo5
POO; Diseo y uso
public class Ruta5 { private double x=0.0, y=0.0, speed=1.0, direction=0.0; private String name; // Constructores public Ruta5(double x, double y, double speed, double direction, String name) { setX(x); setY(y); setSpeed(speed); setDirection(direction); setName(name); } public Ruta5(String name) { setName(name); }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Ejemplo5
POO; Diseo y uso
/** Mueve un paso. */ public void move() { moveInternal(1); } /** Mueve N pasos. */ public void move(int steps) { moveInternal(steps); } private void moveInternal(int steps) { double angle = degreesToRadians(direction); x = x + (double)steps * speed * Math.cos(angle); y = y + (double)steps * speed * Math.sin(angle); } private double degreesToRadians(double degrees) { return(degrees * Math.PI / 180.0); }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Ejemplo5
POO; Diseo y uso
/** Reporta la ubicacion en la salida estandar. */ public void printLocation() { System.out.println(getName() + " is at (" + getX() + "," + getY() + ")."); } /** Lee la coordenada X. */ public double getX() { return(x); } /** Establece la coordenada X. */ public void setX(double x) { this.x = x; }
Ejemplo5
POO; Diseo y uso
/** Lee la coordenada Y. */ public double getY() { return(y); } /** Establece la coordenada Y. */ public void setY(double y) { this.y = y; } /** Lee la velocidad. */ public double getSpeed() { return(speed); } /** Establece la velocidad. */ public void setSpeed(double speed) { if(speed>200) { System.out.println("La velocidad no debe ser mayor " + "a 200!"); } else { this.speed = speed; } }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Ejemplo5
POO; Diseo y uso
/** Lee el rumbo actual */ public double getDirection() { return(direction); } /** Establece el rumbo */ public void setDirection(double direction) { this.direction = direction; } /** Lee el nombre de la ruta. No puede ser modificado */ public String getName() { return(name); } private void setName(String name) { this.name = name; } }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Ejemplo5
POO; Diseo y uso
public class Test5 { public static void main(String[] args) { Ship s1 = new Ruta5("Ruta1"); Ship s2 = new Ruta5(0.0, 0.0, 2.0, 135.0, "Ruta2"); s1.move(); s2.move(3); s1.printLocation(); s2.printLocation(); if (args.length==1) { s1.setSpeed(Integer.parseInt(args[0])); s1.move(); s1.printLocation(); } } }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Ejemplo5
Puntos claves Encapsulacin
Permite realizar cambios a las estructuras de datos y sus representaciones internas sin que los usuarios de la clase tengan que cambiar el cdigo Permite agregar constraints a los valores sin que los usuarios de la clase tengan que cambiar el cdigo Le permite realizar cambios secundarios sin que los usuarios de la clase tengan que cambiar el cdigo
Ejemplo6
Herencia: Vehiculo.java
public class Vehiculo extends Ruta5 { private String color = "red"; /** Asigna el color rojo y una velocidad de 20 km/h. */ public Vehiculo(String name) { super(name); setSpeed(20); } /** Construye un objeto Vehiculo con los argumentos especificados. */ public Vehiculo(double x, double y, double speed, double direction, String name, String color) { super(x, y, speed, direction, name); setColor(color); }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Ejemplo6
Herencia: Vehiculo.java
/** Imprime la ubicacin. Sobreescribe el metodo de la superclase */ public void printLocation() { System.out.print(getColor().toUpperCase() + " "); super.printLocation(); } /** Lee el color del Vehiculo. */ public String getColor() { return(color); } /** Establece el color del Vehiculo. */ public void setColor(String colorName) { color = colorName; } }
Ejemplo6
Herencia: VehiculoTest.java
public class VehiculoTest { public static void main(String[] args) { Vehiculo s1 = new Vehiculo("Vehiculo1"); Vehiculo s2 = new Vehiculo(0.0, 0.0, 2.0, 135.0, "Vehiculo2", "blue"); Ruta5 s3 = new Ruta5(0.0, 0.0, 2.0, 135.0, "Ruta3"); s1.move(); s2.move(); s3.move(); s1.printLocation(); s2.printLocation(); s3.printLocation(); } }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Ejemplo6
Herencia: Ejecucin Compilacin y Ejecucin
javac VehiculoTest.java java VehiculoTest
Salida
RED Vehiculo1 is at (20,0). BLUE Vehiculo2 is at (-1.41421,1.41421). Ruta3 is at (-1.41421,1.41421).
Ejemplo6
Puntos claves Formato de la definicin de subclases Uso de mtodos heredados Uso de super() para accesar a constructores heredados
Solo cuando el constructor sin argumentos no es aceptado
Herencia
Sintaxis de la definicin de subclases
public class NewClass extends OldClass { ... }
Nomenclatura
La clase existente es llamada "superclase", "clase base" o "clase padre" La nueva clase es llamada "subclase", "clase derivada" o "clase hija"
Efecto de la herencia
La subclase automticamente tiene todos los mtodos pblicos y campos de la superclase Puede agregar mtodos y campos que no estn disponibles en la superclase
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
La declaracin package debe ser la primera del archivo Si la declaracin package es omitida, las clases son ubicadas en el paquete por defecto, sin nombre.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
La raz es un paquete que puede ser accesible a travs de la variable de ambiente CLASSPATH
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Paso 2
Definir la variable CLASSPATH
CLASSPATH=$HOME/java/classes export CLASSPATH
Paso 3
Compilar los programas desde el directorio src/paquete1
javac d $CLASSPATH Ruta2.java
Paso 4
Ejecutar los prorgamas desde classes
java paquete1/Test2
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
bits
1
Tipo
char
bits
16
Byte
short
16
Int
32
long
64
Float
Instituto Tecnolgico de Tepic, 2007
32
double
64
Tipo
byte
Tamao
8
Mnimo
-2.00E+007
Mximo
2.00E+007 - 1
short
16
-2.00E+015
2.00E+015 - 1
int
32
-2.00E+031
2.00E+031 - 1
long
Instituto Tecnolgico de Tepic, 2007
64
-2.00E+063
2.00E+063 - 1
Literales
Una literal es un valor especificado en el codigo fuente. Las literales representan valores primitivos o cadenas de caracteres. A continuacin se describen los siguientes tipos de literales.
Literales
Las literales de tipo boolean pueden tener el valor true o false.
boolean a = true; boolean b = false;
Literales de caracteres
char = 'c';
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Literales
Para especificar un carcter en UNICODE se usa la siguiente notacion:
char c1 = '\u4567';
Literales
Caracteres especiales:
'\n' nueva linea. '\r' return. '\t' tab. '\'' comillas simples. '\\' backslash '\"' comillas.
Literales
Los valores enteros se expresan en forma decimal, octal y hexadecimal. Las literales octal llevan el prefijo 0 (cero). Hexadecimal lleva el prefijo 0x 0X. Los valores pueden ser mayscula o minscula.
Literales
Ejemplo. El 28 se puede escribir de las siguientes formas:
28 034 0x1c 0x1C 0X1c 0X1C
La clase String
Para Java las cadenas de texto son objetos especiales. Los textos deben manejarse creando objetos de tipo String. Ejemplo:
String texto1 = "Prueba de texto!";
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Arreglos
Un arreglo en Java es una coleccin ordenada de primitivos, referencias a objetos u otro arreglos. Los arreglos son homogneos, es decir, todos los elementos deben ser del mismo tipo. Los elementos en un arreglo tienen un ndice numrico.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Arreglos
Los arreglos tienen un tamao fijo. Para crear un arreglo se deben seguir tres pasos:
Arreglos
La declaracion le indica al compilador el nombre del arreglo y el tipo de elementos que almacena:
int[] abc; double[] def; Objeto[] ghi; float[][] dosDimensiones;
Arreglos
La declaracin no especifica el tamao del arreglo. El tamao se especifica al momento de ejecucin con el operador new.
int [] ints; ints = new int[20];
Cuando un arreglo se construye sus elementos inicializados a sus valores por defecto.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Longitud de un arreglo
Los arreglos poseen una propiedad que permite conocer su longitud. Se trata de la propiedad length.
La clase Arrays
En el paquete java.utils se encuentra una clase esttica llamada Arrays. Una clase esttica permite ser utilizada como si fuera un objeto. Esta clase posee mtodos muy interesantes para utilizar sobre los arreglos. Su uso es Arrays.mtodo(argumentos);
Mtodos de Arrays
equals
Compara dos arreglos y devuelve true si son iguales. Se consideran iguales si son del mismo tipo, tamao y contienen los mismos valores.
sort
Permite ordenar un arreglo en orden ascendente. Se pueden ordenar slo una serie de elementos desde un determinado punto hasta un determinado punto. int x[]={4,5,2,3,7,8,2,3,9,5}; Arrays.sort(x); Arrays.sort(x,2,5); elemento
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Valor inicial
0 0 0.0f \u0000 null
Tipo
short long double boolean
Valor inicial
0 0L 0.0d false
Arreglos
Los arreglos tienen un ndice para cada elemento con el rango [0 .. n-1].
long[] abc; abc = new long[100]; for(i=0 ; i<100 ; i++) { abc[i] = i * 3; }
Fundamentos de clases
El mtodo main() es el punto de entrada para una aplicacin Java. Para crear una aplicacin es necesario escribir alguna clase con el mtodo main(). La firma de main() es:
public static void main(String args[])
Fundamentos de clases
public static void main(String args[])
Argumentos
Los argumentos que reciben los mtodos se pasan por valor (primitivos) o por referencia (objetos). Cuando un argumento es un primitivo se hace una copia del valor. Los cambios internos a un argumento no surten efecto fuera del mtodo. En el caso de objetos se pasa una referencia al objeto. Esta referencia no puede ser modificada, pero s el objeto. Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Destruccin de objetos
En Java hay un recolector de basura que se encarga de gestionar los objetos que se dejan de usar y de eliminarles de memoria. Este proceso es automtico e impredecible y trabajo en un hilo (thread) de baja prioridad. Este proceso trabaja cuando detecta que un objeto hace demasiado tiempo que no se utiliza en un programa.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Destruccin de objetos
Se puede forzar la eliminacin de un objeto asignndole el valor null. Sin embargo no se libera inmediatamente la memoria, sino que pasar un cierto tiempo hasta su total destruccin. Es posible invocar al recolector de basura desde el cdigo invocando al mtodo esttico System.gc();
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
El mtodo finalize
Es un mtodo que es llamado antes de eliminar definitivamente al objeto para hacer limpieza final.
class uno { dos d; uno() { d = new dos(); } protected void finalize(){ d = null; } }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
El mtodo finalize
Es un mtodo de tipo protected heredado por todas las clases ya que est definido en la clase raz Object. La diferencia respecto a los mtodos destructores de C++ estriba en que en Java no se llaman al instante.
De hecho es imposible saber cuando son llamados.
El mtodo finalize
class Libro { boolean comprobado = false; Libro (boolean comprobar) { comprobado = comprobar; } void correcto() { comprobado = false; } public void finalize() { if (comprobado) System.out.println("Error: Comprobado"); } }
El mtodo finalize
public class CondicionMuerte { public static void main (String[] args) { Libro novela = new Libro(true) ; // Eliminacin correcta: novela.correcto() ; // Modificar la referencia // olvidando la limpieza: new Libro(true) ; // Forzar la recoleccin de basura y // finalizacin: System.runFinalization(); System.gc(); } }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Modificadores
Modificadores Introduccin
Los modificadores son palabras reservadas que proveen informacin al compilador acerca de la naturaleza del cdigo, datos o clases. Los modificadores especifican las, por ejemplo, que una caracterstica es de tipo static, final o transient. Una caracterstica es una clase, un mtodo o una variable. Un grupo de modificadores, llamados modificadores de acceso, indican qu clases tienen permitido utilizar una caracterstica.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Modificadores Introduccin
Los modificadores ms comunes son los de acceso: public, protected y private. El resto de los modificadores no se pueden categorizar.
final abstract static native transient synchronized volatile
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Modificadores de Acceso
Los modificadores de acceso determinan qu clases pueden utilizar cierta caracterstica. Las caractersticas de una clase son:
La clase misma. Sus variables. Sus mtodos y constructores.
Las nicas variables sobre las que se aplican los modificadores de acceso son las variables de clase. Las variables de los mtodos no llevan modificadores de acceso porque pertenecen nicamente al mtodo.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Modificadores de Acceso
Los modificadores de acceso son:
public private protected
El nico modificador de acceso permitido para una clase no interna es public. Una caracterstica puede tener como mximo un modificador. Cuando una caracterstica no tiene modificador de acceso se toma un valor por defecto. El valor por defecto no tiene un nombre estndar (friendly, package o default).
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Declaraciones no permitidas:
public protected int x; default Objeto getObjeto() { }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Modificadores de Acceso: public El modificador de acceso ms permisivo es public. Cualquier clase, variable o mtodo publico se puede utilizar en cualquier clase en Java. Las aplicaciones Java deben declarar el mtodo main().
Modificadores de Acceso: private El modificador private es el ms restrictivo. Una variable o mtodo de tipo privado slo es accesible para las instancias creadas por la misma clase.
Otros modificadores
Los modificadores que no son de acceso son los siguientes:
final abstract static native transient synchronized volatile
Modificadores: final
Se trata de una palabra que se coloca antecediendo a un mtodo, variable o clase. Sirve para indicar que ese mtodo no puede ser sobrescrito por las subclases. Si una subclase intentar sobrescribir el mtodo, el compilador de Java avisar del error.
Una clase final no puede tener herencia. Una variable de tipo final no puede ser modificada una vez que se le haya asignado un valor. Un mtodo final no puede ser redefinido por una clase que herede.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Se indican en la clase para que el desarrollador que desee crear una subclase heredada de la clase abstracta, est obligado a sobrescribir el mtodo. Las clases abstractas no deben de ser instanciadas.
No se pueden crear objetos de las clases abstractas)..
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Modificadores: static Normalmente hay que crear objetos para poder utilizar los mtodos y propiedades de una determinada clase. Esto no es necesario si la propiedad o el mtodo se definen precedidos de la palabra clave static. De esta forma se podr utilizar el mtodo sin definir objeto alguno, utilizando el nombre de la clase como si fuera un objeto.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Modificadores: static
Los mtodos tambin pueden ser declarados static. Los mtodos estticos no tienen acceso a las caractersticas no estticas de la clase. Los mtodos estticos no realizan operaciones sobre objetos, por lo que pueden ser llamados sin crear una sola instancia de la clase. El mtodo main es un ejemplo.
Modificadores: static
El tercer uso de static es para inicializar bloques de cdigo.
public class Estatica { static int x = 1; static { System.out.println("Hola 1" + x++); } public static void main(String args[]) { System.out.println("Hola 2" + x++); } }
Modificadores: static
Parece un mtodo, pero es simplemente la palabra clave static seguida de un cuerpo de mtodo. Este cdigo, como otras inicializaciones estticas, se ejecuta slo una vez, la primera vez que se cree un objeto de esa clase o la primera vez que se acceda a un miembro esttico de esa clase Se ejecuta incluso si nunca se llega a crear un objeto de esa clase.
Modificadores
Modificado Clase r public protected (default)* private final abstract static native transient volatile synchroniz ed s no s no s s no no no no no Variable s s s s s no s no s s no Mtodo s s s s s s s s no no s Construct or s s s s no no no no no no no Bloque de cdigo no no no no no no s no no no s
Interfaces
Una interfaz en realidad es una serie de constantes y mtodos abstractos. Cuando una clase implementa un determinado interfaz debe anular los mtodos abstractos de ste, redefinindolos en la propia clase. Esta es la base de una interfaz, hay una obligacin por parte de la clase que implemente la interfaz de redefinir los mtodos de sta. No definen el tipo de objeto que es, sino lo que puede hacer (sus capacidades).
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Interfaces
Una interfaz se crea exactamente igual que una clase. La diferencia es que la palabra interface sustituye a la palabra class y que slo se pueden definir en un interfaz constantes y mtodos abstractos.
interface arrancable(){ boolean motorArrancado=false; void arrancar(); void detenerMotor(); }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Conversin y Casting
Conversin de primitivos
Los tipos de datos primitivos de Java pueden ser convertidos en otros tipos. La conversin de un primitivo se puede dar en los siguientes casos.
Asignacin. Llamada a mtodo. Promocin aritmtica.
char
long
float
double
Promocin aritmtica
Las reglas que se aplican a la promocin aritmtica dependen del tipo de operador: unario o binario. Los operadores unarios se aplican a un solo valor. Los operadores binarios requieren dos valores.
Operadores unarios
+ +
&
++ * ^
-/ | %
Operadores binarios
Promocin aritmtica
Para los operadores unarios se aplican dos reglas:
Si el operando es de tipo byte, short o char, se convierte a un int De lo contrario, no hay conversin.
Promocin aritmtica
Para los operadores binarios se aplican las siguientes reglas:
Si uno de los operandos es de tipo double, el otro operando es convertido a double. Si uno de los operandos es de tipo float, el otro operando es convertido a float. Si uno de los operandos es de tipo long, el otro operando es convertido a long. De lo contrario, ambos operandos son convertidos a int.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Primitivos y casting
En los casos vistos previamente, Java hace automticamente la conversin de datos. casting significa indicarle al compilador explcitamente que se requiere una conversin. Para hacer una operacin de casting se usa el tipo de dato entre parntesis. int i = 5; double d = (double)i; // igual int i = 5; double d = i;
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Casting
Las operaciones de casting son necesarias cuando el tipo de dato al cual se va a convertir es ms chico que el tipo original. Este tipo de conversin no se hace implcitamente.
// Ilegal short s = 259; byte b = s; // error System.out.println("s = " + s + ", b = " + b); // Legal short s = 259; // 100000011 byte b = (byte)s; // casting explcito System.out.println("s = " + s + ", b = " + b);
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Ciclos
Existen 5 construcciones que operan en ciclos:
while do for continue break
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
while
while(condicin boolean) bloque o sentencia int 1 = 0; while(i <= 5) System.out.println("cinco veces"); System.out.println("una vez"); int 1 = 0; while(i <= 5) { System.out.println("cinco veces"); System.out.println("una vez"); }
do while
do ciclo while(condicin booleana) do { ciclo } while(condicin booleana) El ciclo do while se ejecuta por lo menos una vez.
Desarrollo de Aplicaciones para Internet con Java
for
for( sentencia ; condicin ; expresin) ciclo for( sentencia ; condicin ; expresin) { ciclo } La sentencia se ejecuta una vez antes del ciclo. La condicin debe ser una expresin booleana, similar a la condicin de while. El ciclo se ejecuta repetidamente mientras la condicin tenga el valor true. La expresin se ejecuta inmediatamente despus del bloque del ciclo.
continue
continue se emplea para salir de ciclos anidados o para interrumpir un bloque dentro de un ciclo.
salida: for(i = 0 ; i < 5 ; i++) for(j = 0 ; j < 10 ; if( (i*2) == j continue } } } { j++) { ) { salida;
break
break se utiliza para interrumpir ciclos. j = 0; while(j < 10) { if(j == 7) { break; } System.out.println("j : " + j ); j++; }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Sentencias de seleccin
En Java existe dos tipos de sentencias de seleccin:
if / else switch
if /else
La estructura condicional if / else toma una sentencia booleana como condicin. Se ejecuta nicamente un bloque. Tres tipos de combinaciones para estructuras if. if(condicin) { bloque } if(condicin) { bloque1 } else { bloque2 }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
if
if(condicin) bloque1 {
switch
La estructura de seleccin switch tiene la siguiente estructura:
swith(valor int) { case 1: // 1 break; case 2: // 2 break; case 3: // 3 break; default: // bloque defecto (opcional) break; Instituto Desarrollo de Aplicaciones para Internet con Java } Tecnolgico de Tepic, 2007
Manejo de Excepciones
Manejo de errores
Excepciones En java, la clase que maneja las excepciones es Exception (java.lang.Exception)
Est basad en la clase Throwable (java.lang.Throwable).
La clase de Throwable lleva a cabo una especie de "foto" de qu suceda en el cdigo cuando ocurri la excepcin. Puede tambin contener una secuencia de mensajes que den ms informacin sobre el error.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Throwable
Segn su superclase, hay dos tipos de excepciones
Checked: el programa no compila si no existe un manejador de excepciones. Son las subclases de Exception que no son subclases de RuntimeException. Unchecked: su captura no es obligatoria. Son las subclases de RuntimeException. java.lang.Object java.lang.Throwable java.lang.Exception java.lang.RuntimeException
Lo lgico sera que RuntimeException fuera subclase de Throwable, pero por algn motivo histrico (?) no es as. En el constructor de Throwable se puede especificar:
Un mensaje indicando el motivo de la excepcin. Instituto de Tepic, 2007 a otro objeto Throwable asociado. Desarrollo de Aplicaciones para Internet con Java Tecnolgico Una referencia
El mtodo getStackTrace()
Devuelve un array de elementos StackTraceElement, que representan cada uno (excepto el primero en la pila) una llamada a un mtodo. Cuando ejecutamos Throwable.printStacktrace() obtenemos una representacin como cadena de estos objetos. Todos los objetos derivados de Throwable proporcionan la informacin siguiente:
El tipo de excepcin (la clase). Donde ocurri la excepcin (el stacktrace). Un mensaje de error.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Manejo de errores
Bloques "try/catch/finally"
Dentro del bloque try se colocan las instrucciones susceptibles de provocar una excepcin. El bloque catch sirve para capturar esa excepcin y evitar el fin de la ejecucin del programa.
Desde el bloque catch se maneja, en definitiva, la excepcin.
Manejo de errores
Bloques "try/catch/finally" Cuando se produce una excepcin, se busca el catch que posea el manejador de excepcin adecuado.
Ser el que utilice el mismo tipo de excepcin que se ha producido.
Esto puede causar problemas si no se tiene cuidado, ya que la clase Exception es la superclase de todas las dems.
Si se produjo, por ejemplo, una excepcin de tipo AritmethicException y el primer catch captura el tipo genrico Exception, ser ese catch el que se ejecute y no los dems.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Manejo de errores
Bloques "try/catch/finally"
boolean indiceNoValido=true; int i,j; //Entero que tomar nos aleatorios de 0 a 9 String texto[]={"Uno","Dos","Tres","Cuatro","Cinco"}; while(indiceNoValido){ try{ i=(int)Math.round(Math.random()*9); System.out.println(texto[i]); indiceNoValido=false; if(!indiceNoValido) j = Integer.parseInt(texto[i]); }catch(ArrayIndexOutOfBoundsException exc){ System.out.println("Fallo en el ndice"); } } Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Manejo de errores
Tipos de excepcin
Hay muchos tipos de excepciones en Java, y todos se basan en la clase Exception. Puede capturar cualquier tipo de excepcin especificando el objeto Exception en un bloque catch. Puede ser ms selectivo especificando un tipo particular de excepcin.
try { . . . } catch (ArrayIndexOutOfBoundsException e) { out.println("Array index out of bounds"); }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Manejo de errores
Excepciones mltiples Puede utilizar mltiples bloques catch declaracin try/catch.
Cada bloque catch puede manejar un tipo de excepcin.
Manejo de errores
Excepciones mltiples
try{ ... //puede haber excepcin objeto.usarArchivo("C:\texto.txt"); .. } catch(IOException ioe){... } catch(InterruptedException ie){... } ... //otros catch para otras posibles excepciones
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Manejo de errores
Puede anidar bloques try dentro de otro bloque try. Si un bloque try interno no encuentra el catch que maneje el tipo especifico de error, utiliza el del bloque externo. En el ejemplo siguiente se da un ejemplo de un programa con bloque try/catch anidados.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Manejo de errores
Bloques "try/catch/finally"
boolean indiceNoValido=true; int i,j; //Entero que tomar nos aleatorios de 0 a 9 String texto[]={"Uno","Dos","Tres","Cuatro","Cinco"}; while(indiceNoValido){ try{ i=(int)Math.round(Math.random()*9); System.out.println(texto[i]); indiceNoValido=false; try { if(!indiceNoValido) j = Integer.parseInt(texto[i]); } catch(NumberFormatException e) { System.out.println(Error de formato); } }catch(ArrayIndexOutOfBoundsException exc){ System.out.println("Fallo en el ndice"); } }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Lanzamiento de excepciones
throws Esta instruccin nos permite lanzar a nosotros nuestras propias excepciones.
O lo que es lo mismo, crear artificialmente nosotros las excepciones. throw new Exception();
El flujo del programa se dirigir a la instruccin try/catch ms cercana. Se pueden utilizar constructores en esta llamada.
El formato de los constructores depende de la clase que se utilice. throw new Exception("Error grave, grave");
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Lanzamiento de excepciones
throws
throw permite tambin relanzar excepciones. Esto significa que dentro de un catch podemos colocar una instruccin throw para lanzar la nueva excepcin que ser capturada por el catch correspondiente
try{ ... } catch(ArrayIndexOutOfBoundsException exc){ throw new IOException(); } catch(IOException){ ... }
La clusula finally
La clusula finally est pensada para limpiar el cdigo en caso de excepcin.
try{ ... }catch (FileNotFoundException fnfe){ ... }catch(IOException ioe){ ... }catch(Exception e){ ... }finally{ ...//Instrucciones de limpieza }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
La clusula finally
Las sentencias finally se ejecutan tras haberse ejecutado el catch correspondiente. Si ningn catch captur la excepcin, entonces se ejecutarn esas sentencias antes de devolver el control al siguiente nivel o antes de romperse la ejecucin. Hay que tener muy en cuenta que las sentencias finally se ejecutan independientemente de si hubo o no excepcin.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Hilos Mltiples
Hilos mltiples
Los objetos proporcionan una forma de dividir un programa en secciones independientes. A menudo, tambin es necesario convertir un programa en subtareas separadas que se ejecuten independientemente. Cada una de estas subtareas independientes recibe el nombre de hilo, y uno programa como si cada hilo se ejecutara por s mismo y tuviera la UCP para l slo.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Hilos mltiples
Un proceso es un programa en ejecucin autocontenido con su propio espacio de direcciones. Un sistema operativo multitarea es capaz de ejecutar ms de un proceso (programa) a la vez, mientras hace que parezca como si cada uno fuera el nico que se est ejecutando, proporcionndole ciclos de UCP peridicamente. Por consiguiente, un nico proceso puede tener mltiples hilos ejecutndose concurrentemente.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Hilos mltiples
Precauciones
El mantenimiento y depuracin se complica significativamente.
Heredar de Thread
La forma ms simple de crear un hilo es heredar de la clase Thread, que tiene todo lo necesario para crear y ejecutar hilos. El mtodo ms importante de Thread es run(), que debe ser sobreescrito para hacer que el hilo haga lo que se le mande. Por consiguiente, run() es el cdigo que se ejecutar "simultneamente" con los otros hilos del programa.
En el momento en que acabe run(), se termina el hilo.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Mecanismo Uno:
Subclase de Thread Cree una subclase de Thread
No es necesario importar paquetes: Thread se encuentra en java.lang
Mecanismo Uno:
Ejemplo
public class HiloSimple extends Thread { private int cuentaAtras = 5; private static int conteoHilos = 0; private int numeroHilo = ++conteoHilos; public HiloSimple() { System.out.println("Creando " + numeroHilo); } public void run() { while(true) { System.out.println("Hilo " + numeroHilo + " ( " + cuentaAtras + " )"); if(--cuentaAtras == 0) return; } }
Mecanismo Uno:
Ejemplo
public static void main (String[] args) { for(int i=0;i<5;i++) new HiloSimple().start(); System.out.println("Todos los hilos" + "Arrancados"); } }
Resultados de HiloSimple
Creando 1 Creando 2 Hilo 1 ( 5 ) Hilo 1 ( 4 ) Hilo 1 ( 3 ) Hilo 1 ( 2 ) Hilo 1 ( 1 ) Creando 3 Creando 4 Creando 5 Todos los hilos Arrancados Hilo 2 ( 5 ) Hilo 2 ( 4 ) Hilo 2 ( 3 ) Hilo 2 ( 2 )
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Hilos demonio
Un hilo "demonio" es aqul que supuestamente proporciona un servicio general en segundo plano mientras se est ejecutando el programa, no siendo parte de la esencia del programa. Por consiguiente, cuando todos los hilos no demonio acaban, se finaliza el programa. Se puede averiguar si un hilo es un demonio llamando a isDaemon()
Se puede activar o desactivar el funcionamiento como demonio de un hilo con setDaemon(). Si un hilo es un demonio, todos los hilos que cree sern a su vez demonios.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Mecanismo Dos:
Runnable
Programe las acciones en el mtodo run del la clase Implemente la interface Runnable
Si la clase es una subclase, cuide que la clase principal no sea subclase de Thread
Cree una instancia del Thread pasando el objeto existente (p.e., el Runnable)
Thread t = new Thread(theRunnable);
Mecanismo Dos:
Ejemplo
class Contador2 implements Runnable { private static int totalNum = 0; private int actualNum, loopLimit; public Contador2(int loopLimit) { this.loopLimit = loopLimit; actualNum = totalNum++; } private void pausa(double segundos) { try { Thread.sleep(Math.round(1000.0*segundos)); } catch (InterrumpedException e) {} }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Mecanismo Dos:
Ejemplo
public void run() { for (int i=0;i<loopLimit;i++) { System.out.println("Contador " + actualNum + ": " + i); pausa(Math.random()); } } } public class pruebaContador2 { public static void main(String[] args) { new Thread(new Contador2(5)).start(); new Thread(new Contador2(5)).start(); new Thread(new Contador2(5)).start(); } }
Errores de ejecucin:
Considere el siguiente cdigo
public class PruebaError implements Runnable { private int totalNum = 0; private int loopLimit = 5; public void start() { for (int i=0; i<3; i++) { new Thread(this).start(); } } private void pausa(double segundos) { try { Thread.sleep(Math.round(1000.0*segundos)); } catch (InterruptedException e) {} } ...
Errores de ejecucin:
Considere el siguiente cdigo
public void run() { int currentNum = totalNum; System.out.println("currentNum igual a " + currentNum ); totalNum = totalNum + 1; for (int i=0;i<loopLimit;i++) { System.out.println("Contador " + currentNum + ": " + i); pausa(Math.random()); } } }
Errores de ejecucin:
Resultado de la ejecucin del cdigo anterior
Resultados normales Resultados ocasionales
currentNum igual a 0 Contador 0:0 currentNum igual a 1 Contador 1:0 currentNum igual a 2 Contador 2:0 Contador 2:1 Contador 1:1 Contador 0:1 Contador 2:2 Contador 0:2 Contador 1:2 Contador 1:3 Contador 0:3 Contador 2:3 Contador 1:4 Contador 0:4 Contador 2:4
currentNum igual a 0 Contador 0:0 currentNum igual a 1 currentNum igual a 1 Contador 0:1 Contador 1:0 Contador 1:0 Contador 0:2 Contador 0:3 Contador 1:1 Contador 0:4 Contador 1:1 Contador 1:2 Contador 1:3 Contador 1:2 Contador 1:3 Contador 1:4 Contador 1:4
Errores de ejecucin:
Solucin Haga las cosas en la menor cantidad de pasos posible
public void run() { int currentNum = totalNum++; System.out.println("currentNum igual a " + currentNum ); for (int i=0;i<loopLimit;i++) { System.out.println("Contador " + currentNum + ": " + i); pausa(Math.ramdom()); } }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Recursos compartidos:
Sincronizacin
Sincronizacin de una seccin de cdigo
synchronized (someObject) { code }
Interpretacin
Cuando un thread ingresa al cdigo protegido, ningn otro thread puede ingresar.
Interpretacin tcnica
Cuando un thread ingresa al cdigo protegido, ningn otro thread puede ingresar a cualquier otra seccin de cdigo protegida con el mismo identificador de bloqueo.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Recursos compartidos:
Sincronizacin
Sincronizacin de un mtodo
public synchronized void someMethod() { code }
Errores de sincronizacin
public class someThreadedClass extend Thread { private static RamdomClass someSharedObject; ... public synchronized void dosomeOperation() { accessSomeSharedObject(); } ... public void run() { while (someCondition) { doSomeOperation(); soSomeOtherOperation(); } } }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Errores de sincronizacin
En el ejemplo la clase SomeThreadedClass contiene un objeto esttico, someSharedObject, que tiene la visibilidad al interior de la clase. Para evitar colisiones y conservar la integridad de datos del objeto compartido, el mtodo, doSomeOperation, es sincronizado. Previene esto que otros hilos accedan al objeto y modifiquen datos compartidos? Recuerde que una declaracin de mtodo sincronizado es equivalente a:
synchronized(this){ ... }
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Errores de sincronizacin
Recuerde que una declaracin de mtodo sincronizado es equivalente a:
synchronized(this){ ... }
Sincronizacin de la clase
synchronized(someThreadedClass.class ) { accessSomeSharedObject(); } }
Sincronizacin de la clase
Otra solucin es de sincronizar sobre la clase. Java usa un objeto de clase nico para representar la informacin sobre cada clase. Si usted sincroniza un mtodo esttico, el bloqueo est es la clase correspondiente no en this.
Estados de bloqueo
Un hilo puede bloquearse por cinco motivos:
1. Se ha puesto el hilo a dormir llamando a sleep(milisegundos), en cuyo caso no se ejecutar durante el tiempo especificado. 2. Se ha suspendido la ejecucin del hilo con suspend(). No se volver ejecutable de nuevo hasta que el hilo reciba el mensaje resume(). 3. Se ha suspendido la ejecucin del hilo con wait(). No se volver ejecutable de nuevo hasta que el hilo reciba los mensajes notify() o notifyAll(). 4. El hilo est esperando a que se complete alguna E/S. 5. El hilo est intentando llamar a un mtodo synchronized de otro objeto y el bloqueo del objeto no est disponible
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
La primera prueba
sleep()
En Durmiente1 todo el mtodo run() es synchronized. Se ver que el Elector asociado con este objeto se ejecutar alegremente hasta que el hilo comience, y despus el Elector se detiene en seco. sta es una forma de bloquear: dado que Durmientel.run() es synchronized, y una vez que el objeto empieza, siempre est dentro de run(), el mtodo nunca cede el bloqueo del objeto, quedando Elector bloqueado.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
La primera prueba
sleep() Durmiente2 proporciona una solucin haciendo run() no synchronized. Slo es synchronized el mtodo cambiar(), lo que significa que mientras run() est en sleep(), el Elector puede acceder al mtodo synchronized que necesite, en concreto a leer( ). Aqu se ver que el Elector contina ejecutndose al empezar el hilo Durmiente2.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Suspender y continuar
La clase Thread tiene un mtodo suspend() para detener temporalmente el hilo y resume() lo contina en el punto en el que se detuvo. Hay que llamar a resume( ) desde otro hilo fuera del suspendido, y en este caso hay una clase separada denominada Resumidor que hace exactamente eso. Cada una de las clases que demuestra tiene un Resumidor asociado.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Suspender y continuar
SuspenderResumirl tiene un mtodo syncronized run( ). Al arrancar este hilo se ver que su Elector asociado se bloquea esperando a que el bloqueo quede disponible, lo que no ocurre nunca. En SuspenderResumir2, no todo el run() es synchronized, sino que usa un mtodo synchronized cambiar(). Java2 ha descontinuado el uso de suspend() y resume() porque puede conducir fcilmente a interbloqueos.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Wait y notify
El mtodo wait( ) libera el bloqueo cuando es invocado, lo que significa que se puede llamar a otros mtodos synchronized del objeto hilo durante un wait( ).
sleep( ) como suspend( ), no liberan el bloqueo cuando son invocados.
En los dos casos el mtodo run() est totalmente synchronized, sin embargo,el Elector sigue teniendo acceso completo a los mtodos.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Bloqueo en E/S
Si un flujo est esperando a alguna actividad de E/S, se bloquear automticamente. Ambas clases funcionan con objetos Reader y Writer, se establece un flujo entubado para permitir a ambos hilos pasarse datos mutuamente de forma segura.
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Javadoc
Comentarios y JavaDoc
Java soporte 3 tipos de comentarios
// Comenta hasta el final de la lnea /* Comenta un bloque de lneas. No se permiten los comentarios anidados */ /** Un comentario JavaDoc ubicado antes de los mtodos pblicos. El texto puede contener etiquetas HTML, enlaces y etiquetas JavaDoc */
JavaDoc
Se utiliza para generar la informacin en lnea
javadoc Foo.java Bar.java
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
Etiquetas JavaDoc
@author
Especifica el autor del documento Debe usar javadoc author para generar la salida
/** Descripcin de la clase ... * @author <A HREF="mailto:jmezag@gmail.com"> Julio Meza</A> */
@version
Versin del documento Debe usar javadoc version para generar la salida
@param
Documenta el argumento del mtodo
@return
Documenta el retorno del mtodo
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
JavaDoc
Ejemplo
/**Clase publica Ship. * * @author <A HREF="mailto:jmezag@gmail.com"> * Julio Meza</A> * @version 2.0 */ public class Ship { private double x=0.0, y=0.0, speed=1.0, direction=0.0; private String name; /** Build a ship with specified parameters. */ public Ship(double x, double y, double speed, double direction, String name) { setX(x); setY(y); setSpeed(speed); setDirection(direction); setName(name); } ...
Instituto Tecnolgico de Tepic, 2007 Desarrollo de Aplicaciones para Internet con Java
JavaDoc
Ejemplo
javadoc -author -version -noindex -notree Ship.java
JavaDoc
Resultado