Sunteți pe pagina 1din 134

Java Bsico

Tema 3

Clases y Objetos

Contenidos
1.- Fundamentos de las clases 2.- Sobrecarga de mtodos y constructores 3.- Envolventes de tipo, autoencuadre y autodesencuadre 4.- Enumeraciones 5.- Clases predefinidas

Java Bsico

Fundamentos de las clases

Fundamentos de las Clases


Una clase es una plantilla que define la forma de un objeto y especifica los atributos o datos (variables) y el cdigo (mtodos) que operar sobre esos datos. Java usa las clases para construir objetos. Los objetos son instancias de una clase. Por lo tanto, una clase es, en esencia, un conjunto de planos que especifican como construir objetos que comparten las mismas variables y mtodos. Hasta que un objeto de una clase no sea creado, no existe una representacin fsica de esa clase en la memoria.

Los mtodos y variables de una clase se llaman miembros de la clase.


4

La forma general de una clase


Una clase se crea empleado la palabra clave Class
class nombre_clase { // declaracin de atributos o variables de instancias tipo var1; tipo var2; . . . tipo varN;
// declaracin de mtodos tipo metodo1 (parmetros) { // cuerpo del mtodo } tipo metodo2 (parmetros) { // cuerpo del mtodo } tipo metodoN (parmetros) { // cuerpo del mtodo } }

Definicin de una clase


class Rectangulo { // variables de instancia double base, altura; String color; }
Una definicin de clase declara un nuevo tipo de datos. La definicin de Class es solo una descripcin de un tipo, por lo que no crea un objeto real. Por lo tanto, el cdigo anterior no crea ningn rectngulo.

La definicin de una clase Java debe ir en un fichero de texto con extensin .java y nombre idntico a la clase definida. Por ejemplo, la clase Rectangulo debe ir en un fichero Rectangulo.java.
6

Declaracin de una clase


Para crear un objeto Rectngulo, debemos usar la siguiente instruccin:
Rectangulo rectangulo = new Rectangulo( );

El operador new crea una nuevo objeto (instancia) de la clase Rectngulo. Cada objeto de la clase Caja tendr sus propias copias de las variables ancho, deposito y consumo.

Acceso las variables de un objeto.


Para acceder a las variables miembro usaremos el operador punto (.) de la siguiente forma.

objeto.miembro Ejemplo: Rectangulo1.base = 10;


7

Definicin de una clase


// Este programa crea objetos de la clase Rectngulo
class RectanguloDemo { public static void main( String args[ ] ) { Rectangulo rect1 = new Rectangulo ( ); // asignamos valores al objeto rectangulo1 rect1.base = 10; // usamos el operador punto para rect1.altura = 5; // acceder a cada miembro rect1.color = Rojo;

// calculamos el rea del objeto rectacgulo1;


double area = rect1.base * rect1.altura; // mostramos los resultados System.out.println(rea rectngulo + rect1.color + = } }
8

+ area);

Declaracin de una clase


El nombre del archivo fuente debe ser RectanguloDemo.java porque el mtodo main esta es dicha clase. Al compilar el programa se generan dos archivos .class, uno por cada clase que ha sido definida: Rectangulo.class y RectanguloDemo.class. No es necesario que el cdigo fuente de ambas clases estn en el mismo archivo, podran estar en archivos separados. Para ejecutar el programa, debemos ejecutar RectanguloDemo.class, que mostrar la siguiente salida: rea del rectngulo Rojo = 15.0

Cada objeto tiene sus propias copias de las variables de instancia definidas en la clase. Por lo tanto el contenido de las variables de un objeto pueden ser diferentes de las de otro de la misma clase.
9

Declaracin de una clase


Ejemplo:
class DosRectangulos { public static void main(String args[]) { Rectangulo r1 = new Rectangulo(); Rectangulo r2 = new Rectangulo(); r1.base = 10.0; r2.base = 15.2; r1.altura = 5.0; r2.altura = 7.5; r1.color = Rojo; r2.color = Verde;

double area1 = r1. base * r1.altura; double area2 = r2. base * r2.altura; System.out.println(rea rectngulo + r1.color + = area1); System.out.println(rea rectngulo + r2.color + = area2); } }
10

Cmo se crean los objetos


Creamos una instancia de la clase Rectngulo con la instruccin: Rectangulo rect1 = new Rectangulo ( );
o tambin as Rectangulo rect1; rect1 = new Rectangulo( ); // declaracin // creacin de objeto

Rectangulo rect1

null rect1

Declara rect1 como una variable que hace referencia a un objeto de la clase Rectangulo, pero no es un objeto en s. rect1 contiene un valor null. El operador new crea un objeto de la clase Rectangulo y asigna a la variable rect1 una referencia a dicho objeto. Ahora, rect1 esta vinculado con un objeto.
11

Rect1 = new Rectangulo(); base altura 0.0 0.0

rect1

Color
Objeto rect1

Variables de referencia y asignacin


Las variables de referencia a objetos actan de diferente manera a como lo hacen las variables de tipo primitivo (int, double, char, ...). Consideremos el siguiente fragmento de cdigo: Rectangulo r1 = new Rectangulo ( ); Rectangulo r2 = r1; // la variable de referencia r2 se refiere a r1 r1.base = 5; Comprobemos lo que guardan: System.out.println(r1.base); System.out.println(r2.base); En ambos casos nos devolver un valor de 5. Ambas variables r1 y r2 es que se refieren al mismo objeto. Podremos actuar sobre el mismo objeto mediante r1 o r2.
12

Variables de referencia y asignacin


Rectangulo r1 = new Rectangulo ( ); Rectangulo r2 = r1; Rectangulo r3 = new Rectangulo ( ); r1.base = 5; r3.base = 12.5; r2 = r3;
A r2 se le cambia la referencia del objeto al que se refiere.
base 5

r1

altura color

r2
base 12.5

r3

altura color
13

Mtodos
Como ya se explic, las variables de instancia y los mtodos son los miembros de una clase. Hasta ahora la clase Rectngulo contiene datos, pero no mtodos. Los mtodos son subrutinas de cdigo que manipulan los datos definidos por la clase y, en muchos casos, proporcionan acceso a esos datos. En la mayora de los casos, otras partes de un programa interactan con una clase a travs de sus mtodos. Un mtodo contiene una o ms instrucciones. En un cdigo Java bien escrito, cada mtodo slo realiza una tarea y tiene un nombre, que se utiliza para llamar al mtodo. En general, podemos asignarle a un mtodo el nombre que queramos, excepto main(), que est reservado para el mtodo principal que inicia la ejecucin de un programa. Tampoco podemos asignar a un mtodo el nombre de una palabra reservada.
14

Mtodos
La forma general de un mtodo es: tipo_retorno nombre ( lista_parmatros ) { // cuerpo del mtodo }

El tipo_retorno es el tipo de valor devuelto por el mtodo. Si el mtodo no devuelve un valor, su tipo de retorno debe ser void. La lista_parametros es una lista de pares de tipo - identificador, separados por comas. Si el mtodo no tienen parmetros, la lista de parmetros estar vaca. Los parmetros son variables que reciben el valor de los argumentos que se pasan al mtodo cuando ese es llamado. Habitualmente, los mtodos de una clase manipulan y proporcionan acceso a los datos de la clase.
15

Aadir un mtodo a una clase


Para aadir un mtodo a nuestra clase Rectngulo deberemos especificarlo dentro de la definicin de la clase. Veamos como:

class Rectangulo { double base, altura; String color; // mtodo para calcular el rea void area( ) { System.out.println(rea = + base * altura); } }
Las variables de instancia base y altura dentro del mtodo area son referidas sin hacer uso del operador punto. Esto es as porque para el mtodo son variables de instancia definida por su clase.
16

Llamar a un mtodo a una clase


// Llamada a un mtodo de una clase class AgregarMetodo { public static void main(String args[]) { Rectangulo r1 = new Rectangulo(); // asignamos valores a las varibles de instancia r1.base = 10.0; r1.altura = 5.0; r1.color = Rojo; // Mostramos el color y rea del rectngulo System.out.println(Rectngulo + r1.color + r1.area()); } }
La llamada al mtodo area del objeto r1 de la clase Rectangulo mostrar rea = 15
17

Regreso de un mtodo.
Un mtodo finalizar, bien porque alcanza la llave de cierre del mtodo o porque se encuentra con un return dentro del cdigo. En ambos casos, se produce la terminacin del mtodo y el control del programa se devuelve a quien realiz la llamada al mtodo. Un mtodo con tipo de retorno void terminar al alcanzar la llave de cierre o al ejecutar una instruccin return. Hay dos formas de return:

Para usarlo en mtodos void (los que no devuelven valor). Para usarlos en mtodos que devuelven un valor.

18

Devolucin de un valor
Los mtodos pueden devolver un valor a quien les llama usando la sentencia return de la forma:

return valor;
class Rectangulo { double base, altura; String color; // Mtodo que devuelve el rea del rectngulo double area( ){ return base * altura; //devuelve el rea } }
La ventaja de este cambio es que aporta flexibilidad al mtodo, ya que podremos utilizarlo en ms ocasiones, donde necesitemos el valor del rea para otros clculos y donde pretendamos mostrarlo como tal caracterstica del objeto.

19

Devolucin de un valor
// Devolucin de un valor por un mtodo class DevuelveValor { public static void main(String args[]) { Rectangulo r1 = new Rectangulo();

// asignamos valores a las varibles de instancia r1.base = 10.0; r1.altura = 5.0; r1.color = Rojo;
// Mostramos el color y rea del rectngulo System.out.println(rea rectngulo + r1.color + = r1.area() ); } }
La llamada al mtodo devolver el rea del rectngulo
20

Uso de parmetros
Es posible pasar uno o ms valores a un mtodo cuando este es llamado. El valor pasado a un mtodo es un argumento. Dentro del mtodo, la variable que recibe el argumento es un parmetro. Los parmetros se declaran dentro del parntesis que sigue al nombre del mtodo. La sintaxis para declarar parmetros es la misma que hemos visto para la declaracin de variables.

tipo parmetro, tipo parmetro,


Un parmetro se encuentra dentro del alcance del mtodo y se comporta como cualquier otra variable local dentro del mtodo.
21

Uso de parmetros
Vamos crear un mtodo llamado EsPar que compruebe si el nmero que recibe como argumento es un nmero par o impar.
class ComNum { boolean esPar (int x){ // x es un parmetro de esPar if ( x % 2 == 0 ) return true; else return false; } } class ParamDemo1 { public static void main(String args[]){ ComNum n = new ComNum(); if (n.esPar(10) System.out.println(10 es Par); } }
22

Uso de parmetros
Un mtodo puede tener ms de un parmetro, basta declararlos separados por comas.
class Divisor { boolean EsDivisor(int n, int d){ // dos parmetros if (n % d == 0) return true; else return false; } } class ParamDemo2 { public static void main(String[] args){ Divisor n = new Divisor(); if (n.EsDivisor(20,2)) System.out.println(2 es divisor); }

}
23

Constructores
Un constructor inicializa un objeto cuando ste se crea. Tiene el mismo nombre de su clase y es sintcticamente similar a un mtodo. Sin embargo, los constructores no tienen un tipo de retorno. Por lo general, usaremos un constructor para dar valores iniciales a las variables de instancia definidas por la clase, o para realizar cualquier otra accin de inicio que se requiera para crear un objeto. Todas las clases tiene constructores, ya sea porque el programador los
defina, o porque Java proporciona un constructor por defecto que inicializa todas las variables miembro.

24

Constructores
Cuando a una clase se le define un constructor, el constructor por defecto no se usa nunca.

class MiClase { int x, y; // Un constructor simple para MiClase MiClase( ) { // sin parmetros x = 10; y = 5; } }

25

Constructores
El constructor de la clase ser llamado cuando creemos un objeto de la clase con el operador new.
class ConsDemo{ public static void main (String args[ ]) { MiClase t1 = new MiClase( ); MiClase t2 = new MiClase( ); /* El constructor MiClase( ) crea el t1 y t2 y da valores a las variables.*/ System.out.println(Valores t1: + t1.x + + t1.y ; System.out.println(Valores t2: + t2.x + + t2.y); } } Resultado: Valores t1: 10 5 Valores t2: 10 5
26

Constructores
Los parmetros se aaden a los constructores de la misma forma que se hace con un mtodo: se declaran dentro de parntesis despus del nombre del constructor.
class MiClase { int x, y; MiClase(int x, int y) { x = 10; y = 5; } }

// con parmetros

class ConsDemo{ public static void main (String args[ ]) { MiClase t1 = new MiClase(10, 15); System.out.println(Valores t1 : + t1.x + + t1.y ; } }
27

Constructores
Podemos mejorar la clase Rectangulo agregando un constructor.

class Rectangulo { double base, altura; String color; // constructor de la clase Rectangulo Rectangulo (double b, double h, String c){ base = b; // inicializa la base altura = h; // inicializa la altura color = c // inicializa el color } double area() { return base * altura; } }

28

Constructores
// Uso de un constructor con parmetros class ConsRectDemo{ public static void main (String[] args) { /*Construimos dos rectngulos con sus valores de base, altura y color iniciales */ Rectangulo r1 = new Rectangulo(10.0, 15.0, Rojo); Rectangulo r2 = new Rectangulo(7.5, 5.2, Azul); System.out.println( Rectangulo + r1.color) ; System.out.println( Area: + r1.area) ; System.out.println( Rectangulo + r2.color) ; System.out.println( Area: + r2.area) ; } }
29

El operador new
Ahora que sabemos ms de las clases y sus constructores, echemos un vistazo al operador new. Su forma general es: NombreClase variableReferencia = new NombreClase( );
NombreClase es la clase que ser instanciada. variableReferencia es el nombre del objeto que se crea. NombreClase( ) es el constructor de la clase.

Si una clase no define su propio constructor, new usar el constructor por defecto que proporciona Java. De este modo, new puede usarse para crear un objeto de cualquier tipo de clase. El operador new asigna memoria dinmicamente para almacenar los objeto creados. Cuando no se puede asignar memoria a un objeto, ocurrir una excepcin (error) en tiempo de ejecucin.
30

La palabra clave this


Cuando se llama a un mtodo, se pasa automticamente un argumento implcito que es una referencia al objeto en el que se llama al mtodo. Esta referencia se llama this. Por tanto, la palabra this puede ser utilizada dentro de cualquier mtodo para referirse al objeto actual que invoc al mtodo.

Cuando una variable local de un mtodo tiene el mismo nombre que una variable de instancia, la variable local oculta a la variable de instancia. El siguiente ejemplo es incorrecto:
// Colisin de nombres. Esto es INCOCORRECTO Rectangulo (double base,double altura,String color){ base = base; Colisin de nombres: Como los parmetros son altura = altura; iguales a las variables de instancia, ests quedan color = color ocultas y los valores no pueden asignarse. }
33

La palabra clave this


Si queremos usar parmetros con nombres iguales a las variables de instancia debemos usar this.

this permite hacer referencia directamente al objeto y resolver la posible colisin de nombres que pudiera darse entre las variables de instancia y las variables locales.
// Uso de this para resolver colisiones. CORRECTO Rectangulo(double base, double altura, String Color){ this.base = base; this.altura = altura; this.color = color; Esto se refiere a la variable de instancia } color no al parmetro
En esta versin del constructor Rectangulo() los parmetros son los mismos que los de las variables de instancia, pero estas ultimas, estn ocultas, sin embargo, this se usa para descubrir las variables de instancia.
34

Modificadores de acceso de Java


Una parte fundamental de la programacin orientada a objetos es el acceso restringido a los miembros de una clase, lo que ayuda a prevenir el mal uso de un objeto. El control de acceso a miembros de una clase se logra mediante el uso de tres modificadores de acceso: public, private y protected. La modificacin del acceso a un miembro de clase mediante se realiza en su declaracin. La sintaxis es:

modificador miembro_clase
El modificador protected slo se aplica cuando se utiliza herencia; lo explicaremos en el tema de herencia.

35

Modificadores de acceso de Java


Un miembro de clase definido como public puede ser accedido desde cualquier otra parte del cdigo del programa. Esto incluye mtodos definidos en otras clases. public double area()
Un miembro de una clase definido como private, slo es accesible desde otros miembros de su misma clase. As, los mtodos en otras clases no pueden acceder a los miembros private de una clase directamente.

private double base;


La nica forma de accede a un atributo privado de una clase A desde otra clase B es a travs de algn mtodo publico de la clase A.

El modificador de acceso predeterminado es public, a menos que el programa este dividido en paquetes. Un paquete agrupa clases y constituye un medio para organizar y controlar el acceso. 36

Modificadores de acceso de Java


// Uso de modificadores de acceso Class Rectangulo{ private double base, double altura; // acceso privado // mtodos public double area( ) { // calcula el rea return base * altura; } // Propiedades . . . . . . . . . . . . . . . . public void setBase(double a) { // asigna el valor de base base = a; } public void setAltura(double h) { //asigna el valor de altura altura = h; } public double getBase() { // devuelve la base return base; } public double getAltura() { // devuelve altura return altura; }

37

Modificadores de acceso de Java


class AccesoDemo { public static void main ( String args[ ] ) { Rectangulo r1 = new Rectangulo( ); //No se puede tener acceso de la siguiente manera r1.base = 10.0; // INCORRECTO!!!, base es privado

// Acceso correcto a base y altura r1.SetBase(10.0); // correcto, SetBase es publico r1.SetAltura(5.7); // correcto, SetAltura es publico // acceso correcto a area, mtodo pblico System.out.println(Area = + r1.area()); } }
38

El modificador static
En general, un miembro de clase debe ser accedido a travs de un objeto de su clase; sin embargo, es posible crear un miembro que pueda utilizarse por s solo, desde la propia clase, sin referencia a una instancia especfica. Cuando la declaracin de un miembro va precedida de la palabra clave static, se podr acceder a ese miembro antes de que cualquier objeto de su clase se cree, y sin referencia a ningn objeto.

La declaracin de static se puede aplicar a variables y a mtodos.


El ejemplo ms habitual de miembro static es el mtodo main( ), que se declara como tal porque debe ser llamado antes de que exista cualquier objeto.

39

El modificador static
Fuera de la clase, para usar un miembro static slo es necesario especificar el nombre su clase seguido por el operador punto. No es necesario crear ningn objeto.

nombre_clase.miembro_static( )
Las variables declaradas como static son, en esencia, variables globales. Cuando se declara un objeto no se hace ninguna copia de las variables static. Todas las instancias de la clase comparten la misma variable static. Los mtodos static se cargan en memoria a iniciarse la ejecucin de un programa y estn siempre disponibles. No es necesario crear una instancia de la clase en al que estn definidos para utilizarlos.

40

El modificador static
class StaticDemo { static int a = 42; static int b = 99; static void llamame ( ) { System.out.println( a = + a ); } }

class StaticPorNombre { public static void main (String args[ ]) { StaticDemo.llamame(); System.out.println( b = + StaticDemo.b ); } }

Salida:

a = 42 b = 99
41

El modificador static
class StaticDemo2 { int x; // variable de referencia normal static int y; // variable static } class SDemo { public static void main (String args[ ]) { StaticDemo2 ob1 = new SytaticDemo2(); StaticDemo2 ob2 = new SytaticDemo2(); ob1.x = 10; ob2.x = 20;

System.out.println(Ob1.x y Ob2.x son independientes); System.out.println(Ob1.x : + ob1.x + ob2.x: + ob2.x);

. . .

42

El modificador static
. . .
/*Cada objeto comparte una sola copia de una variable static */ System.out.println(\nSe comparte la variable y); ob1.y = 19; System.out.println(ob1.y : + ob1.y + ob2.y: + ob2.y); System.out.println(\nAcceso a y mediante su clase); StaticDemo2.y = 11; System.out.println(StaticDemo2.y: + StaticDemo2.y); System.out.println(ob1.y : + ob1.y + ob2.y: + ob2.y); } } La salida de SDemo ser:
Ob1.x y Ob2.x son independientes ob1.x = 10 ob2.x = 20
Se comparte la variable y ob1.y = 19 ob2.y = 19 Acceso a y mediante su clase StaticDemo2.y = 11 ob1.y = 11 ob1.y = 11

43

El modificador static
Los miembros declarados como static tiene varias restricciones:

Slo pueden llamar a otros mtodos static Slo pueden acceder a datos static No pueden tener referencia this

// ejemplo de mtodo static ilegal class StaticError { int denom = 3; // variable de referencia normal static int val = 1024; // variable static /* Error!!! No se puede acceder a variables static ,desde un mtodo static */ static int valDivDenom ( ) { return val / denom; // denom NO es static, no compila !!!! } }

44

Bloque static
A veces puede ser necesario inicializar ciertas variables static antes de que se emplee cualquiera de los mtodos static de la clase. Para estas situaciones, Java permite declarar un bloque static que se ejecuta cuando se carga la clase por primera vez, antes de que la clase pueda emplearse para cualquier otro fin.
// Uso de un bloque static class StaticBloque { static double raizde2, static double raizde3; static { System.out.println(Dentro del bloque static.); raizde2 = Math.sqrt(2.0); //mtodo sqrt de la clase Math raizde3 = Math.sqrt(3.0); } static class mensaje(String msj){ System.out.pritln(msj); } }
45

Bloque static
Class RaizDemo { public static void main (String args[ ]) { StaticBloque.mensaje(Ejemplo de Static); System.out.prinln(Raz cuadrada de 2: + StaticBloque.raizde2); System.out.prinln(Raz cuadrada de 3: + StaticBloque.raizde3); } }

No ha sido necesaria la nstanciacin de un objeto de la clase para ejecutar el programa, ya que todos los miembros de la clase han sido declarados static.
Se muestra la salida: Ejemplo de static Raz cuadrada de 2: 1.4142135623730951 Raz cuadrada de 3: 1.7320508075688772
46

El modificador final
Declarando una variable como final se impide que su contenido sea modificado. Esto implica que estas variables deben ser inicializadas cuando son declaradas. final int PI = 3.1416; Un convenio muy utilizado en programacin es el de utilizar nombres en maysculas para las variables final. El uso de la palabra clave final con los mtodos se ver en el tema de herencia.

47

Resumen modificadores Java

48

Paso de objetos a mtodos


Resulta correcto y muy comn pasar objetos a mtodos.
class Rectangulo { double base, altura;
Rectangulo(double b, double h) { base = b; altura = h; } boolean mismoRectangulo(Rectangulo ob){ //parmetro objeto return (ob.base == base) & (ob.altura == altura); } }

49

Paso de objetos a mtodos


class pasaObjeto public static Rectangulo Rectangulo Rectangulo { void r1 = r2 = r3 = main ( String args[ ] ) { new Rectangulo( 10.0, 5.0 ); new Rectangulo( 10.0, 5.0 ); new Rectangulo( 6.0, 5.0 );

System.out.println (r1 mismo tamao que r2: r1.mismoRectangulo(r2)); System.out.println (r1 mismo tamao que r3: r1.mismoRectangulo(r3)); } }

La salida que genera el programa es: r1 mismo tamao que r2: true r1 mismo tamao que r3: false
50

Cmo se pasan los argumentos


Java ofrece dos formas de pasar un argumento a un mtodo, llamada por valor y llamada por referencia, segn sea el argumento que se pasa. En una llamada por valor se copia el valor del argumento en el parmetro del mtodo cuando este es llamado. Los cambios realizados en parmetro del mtodo no tiene efecto en el argumento de la llamada.

En una llamada por referencia, se pasa una referencia del argumento (no su valor) al parmetro. Dentro del mtodo, esta referencia se usa para acceder al argumento pasado en la llamada. Los cambios realizados al parmetro afectarn al argumento de la llamada.
En Java, los argumentos de tipos primitivos (int, double, etc) siempre se pasan por valor a los mtodos.

51

Cmo se pasan los argumentos


class Prueba { void NoCambia (int i,int j) {// i y j son parmetros por valor i = i * 2; j = - j; } } class LlamadaPorValor { public static void main(String args[]){ Prueba ob = new Prueba(); int a = 15, b = 20; System.out.println(a y b antes de la llamada: + a + + b ); ob.NoCambia(a,b); System.out.println(a y b despus de la llamada: + a + + b) } }
La salida que genera el programa es: a y b antes de la llamada : 15 20 a y b despus de la llamada : 15 20

52

Cmo se pasan los argumentos


Los argumentos objetos siempre se pasan por referencia a los mtodos.

Recordamos que cuando se crea una variable de un tipo clase, slo se crea una referencia a un objeto. Por lo tanto, cuando se pasa una variable de referencia a un mtodo, el parmetro que la recibe, se referir al mismo objeto. Por lo tanto:
Los cambios que se realicen al objeto dentro del mtodo afectarn al objeto usado como argumento.

Para pasar un tipo primitivo por referencia, java define las clases envolventes Double, Float, Byte, Short, Integer, Long y Character, que adems, implementan varios mtodos para manipular sus valores.
53

Cmo se pasan los argumentos


// Los objetos siempre se pasan por referencia class Prueba { int a, b; Prueba (int i, int j) { a = i; b = j; } void cambio(Prueba ob) { // Pasa un objeto. ob.a = ob.a + ob.b; ob.b = -ob.b; } }

class LlamadaPorReferencia { public static void main ( String args[ ] ) { Prueba ob = new Prueba(15,20); System.out.println(ob.a y ob.b antes: + ob.a + + ob.b ); ob.Cambio(ob); System.out.println(ob.a y ob.b despus: + ob.a + + ob.b ); } }
La salida que genera el programa es: ob.a y ob.b antes: 15 20 ob.a y ob.b despus: 35 -20

54

Devolucin de objetos
Un mtodo puede devolver cualquier tipo de datos, incluyendo objetos de clases definidas por el programador.
class Test{ int a; Test (int i) { //constructor a = i ; } Test increnDiez(){ // Devuelve un objeto Test // incrementa en 10 unidades el valor del atributo a Test temp = new Test(a + 10); return temp; } }
55

Devolucin de objetos
// Devolucin de objetos class DevuelveObjeto { public static void main(String args [ ] ) { Test ob1 = new Test(2); Test ob2; ob2 = ob1.increnDiez(); System.out.println(ob1.a: + ob1.a ); System.out.println(ob2.a: + ob2.a ); ob2 = ob2.increnDiez( ); System.out.println(ob2.a despus del 2 inc.: + ob2.a); } }
La salida que genera el programa es:
ob1.a: 2 ob2.a: 12 ob2.a despus del 2 incremento :22

56

Java Bsico

Sobrecarga de mtodos y constructores


57

Sobrecarga de mtodos
En Java es posible definir dos o ms mtodos que compartan el mismo nombre, dentro de la misma clase, pero con distintos parmetros. Cuando se produce esta situacin, se dice que los mtodos estn sobrecargados, y que el proceso es una sobrecarga de mtodo.
La sobrecarga de mtodos es una de las formas en que Java implementa el polimorfismo.

Cuando se invoca a un mtodo sobrecargado, Java utiliza el tipo y/o nmero de argumentos como gua para determinar a qu versin del mtodo sobrecargado se debe llamar. Por lo tanto, los mtodos sobrecargados deben diferir en el tipo y/o nmero de sus parmetros.

58

Sobrecarga de mtodos
El tipo que devuelve un mtodo, por s solo es insuficiente para distinguir dos versiones diferentes de un mtodo. Cuando Java encuentra una llamada a un mtodo sobrecargado, se ejecuta la versin del mtodo cuyos parmetros coinciden con los argumentos utilizados en la llamada.

Veamos un ejemplo que ilustra la sobrecarga de mtodos...

59

Sobrecarga de mtodos
// Ejemplo de sobrecarga de mtodos
class SobrecargaDemo { void test ( ) { System.out.println( Sin parmetros); } // Sobrecarga con un parmetro entero void test ( int a ) { System.out.println( a : + a ); } // Sobrecarga con dos parmetros enteros void test ( int a, int b ) { System.out.println( a y b : + a + + b ); } // Sobrecarga con un parmetro double double test ( double a ) { System.out.println( a double : + a ); return a*a; } }
60

Sobrecarga de mtodos
class Sobrecarga { public static void main ( String args[ ] ) { SobrecargaDemo obj = new SobrecargaDemo( ); double resultado; // llamada a todas las versiones de test obj.test( ); obj.test( 10 ); obj.test( 10, 20 ); resultado = obj.test( 123.25 ); System.out.println(Resultado : + resultado ); } }

61

Sobrecarga de mtodos
El programa produce la salida : Sin parmetros a : 10 a y b : 10 20 a double : 123.25 Resultado de obj.test(123.25) : 15190.5625 Cuando se llama a un mtodo sobrecargado, Java busca las coincidencias entre los argumentos utilizados en la llamada y los parmetros del mtodo.

Esta coincidencia no es preciso que sea siempre exacta. En algunos casos se puede aplicar la conversin automtica de tipos de Java.

62

Sobrecarga de mtodos
// aplicacin de la conversin automtica de tipos en la sobrecarga class SobrecargaDemo { void test ( ) { System.out.println( Sin parmetros); } // Sobrecarga con dos parmetros enteros void test ( int a, int b ) { System.out.println( a y b : + a + + b ); } // Sobrecarga con un parmetro double double test ( double a ) { System.out.println( Dentro del test (double) a: + a ); return a*a; } }

63

Sobrecarga de mtodos
class Sobrecarga2 { public static void main ( String args[ ] ) { SobrecargaDemo obj = new SobrecargaDemo( ); int i = 88; obj.test( ); obj.test( 10, 20 ); obj.test( i ); obj.test( 123.2 ); } // llamada a test ( double ) // llamada a test ( double )

}
64

Sobrecarga de mtodos
La salida generada por el programa es: Sin parmetros a y b : 10 20 Dentro del test (double) Dentro del test (double) Consideraciones sobre la sobrecarga:

a: 88.0 a: 123.2

Cuando se sobrecarga un mtodo, cada versin de ese mtodo debe relacionarse con las dems. Aunque se puede utilizar el mismo nombre para sobrecargar mtodos que no estn relacionados, no se debe hacer. En la prctica, slo se deben sobrecargar operaciones estrechamente relacionadas.
65

Sobrecarga de mtodos
Ejemplo:
class Plano3D { double a, b, c, d; Plano3D (double aa, double bb, double cc, double dd) { a = aa; b = bb; c = cc; d = dd; } boolean paralelo (Plano3D p) { Vector3D u = new Vector3D (a, b, c); Vector3D v = new Vector3D (p.a, p.b, p.c); return u.paralelo (v); } boolean paralelo (Recta3D r) { Vector3D u = new Vector3D (a, b, c); return u.perpendicular (r.vector); } }
66

Sobrecarga de mtodos
class Vector3D { double x, y, z;

Vector3D (double xx, double yy, double zz) { x = xx; y = yy; z = zz; }
Vector3D (Punto3D p, Punto3D q) { x = q.x - p.x; y = q.y - p.y; z = q.z - p.z; } boolean paralelo (Vector3D u) { return (x * u.y == y * u.x) && (x * u.z == z * u.x); }

boolean perpendicular (Vector3D u) { return productoEscalar (u) == 0; }


}
67

Sobrecarga de mtodos
class Recta3D { Punto3D punto; Vector3D vector; Recta3D (Punto3D p, Vector3D v) { punto = p; vector = v; } }
// Bloque main Plano3D p1 = new Plano3D (2, 4, 3, 1); Plano3D p2 = new Plano3D (1, 0, -2, 1); Recta3D r = new Recta3D (new Punto3D (1, 0, 1), new Vector3D (1, 1, -1)); p1.paralelo (p2); p1.paralelo (r);
68

Sobrecarga de constructores
Adems de sobrecargar los mtodos normales, tambin se pueden sobrecargar mtodos constructores. Sea la definicin de la clase caja: class Caja { double ancho; double alto; double largo;

// constructor de la clase Caja ( double w, double h, double d ) { ancho = w; alto = h; largo = d; } // clculo y devolucin del volumen double volumen ( ) { return ancho * alto * largo; } }
69

Sobrecarga de constructores
El constructor de Caja( ) requiere tres parmetros. Esto significa que todas las declaraciones de objetos Caja deben pasar tres argumentos al constructor de Caja: Caja ( double w, double h, double d ) La siguiente sentencia no es vlida: Caja obj = new Caja ( ); Esta situacin plantea algunas cuestiones como: Si solo se necesita una caja, sin importar las dimensiones iniciales. Si se necesita una caja con forma de cubo, solo necesita 1 dimensin. Esta situaciones no se contemplan en la definicin actual de la clase. Veamos una versin mejorada:
70

Sobrecarga de constructores
class Caja { double ancho, alto, largo; // constructores de la clase Caja ( double w, double h, double d ) { ancho = w; alto = h; largo = d; } Caja ( ) { // el valor 1 indica que la caja no est inicializada ancho = -1; alto = -1; largo = -1; } Caja ( double lado ) { // para un con forma de cubo ancho = alto = largo = lado; }

// clculo y devolucin del volumen double volumen ( ) { return ancho * alto * largo; }
}
71

Sobrecarga de constructores
class DemoCaja { public static void main (String args [ ] ) {
Caja Caja1 = new Caja ( 10, 20, 15 ); Caja Caja2 = new Caja ( ); Caja Cubo = new Caja ( 7 ); double vol; vol = Caja1.volumen(); System.out.println(Volumen de Caja1 : + vol ); vol = Caja2.volumen(); System.out.println(Volumen de Caja2 : + vol ); vol = Cubo.volumen(); System.out.println(Volumen de Cubo : + vol ); } }
72

Sobrecarga de constructores
La salida que produce el programa es: Volumen de Caja1 : 3000.0 Volumen de Caja2 : -1.0 Volumen de Cubo : 343.0 Con este constructor sobrecargado, la llamada al mtodo se basa en los parmetros especificados cuando se ejecuta el operador new. De esta manera se le da al usuario una flexibilidad de clase en la forma como son construidos los objetos.

Una de las razones ms comunes para que los constructores sean sobrecargados es permitir que un objeto inicialice a otro.
73

Sobrecarga de constructores
// inicializacin de un objeto con otro class Sumador { int suma; Sumador ( int num ) { suma = 0; for ( int i = 0; i < = num ; i++) suma += 1; } Sumador ( Sumador obj) { suma = obj.suma; } }
74

Sobrecarga de constructores
class SumaDemo { public static void main ( String args [ ] ) {
Sumador s1 = new Sumador ( 5 ); Sumador s2 = new Sumador ( s1 ); System.out.println(s1.suma : + s1.suma); System.out.println(s2.suma : + s2.suma); } } La salida del programa es:

s1.suma : 5 s2.suma : 5
75

La clase Date y GregorianCalendar


Ejemplo:
//* Formatear una fecha como se desee*/
public class Fechas3 { public static void main(){ Date hoy = new Date(); // creamos un objeto fecha Locale fEspaol = new Locale("es", "ES", "Traditional_WIN"); String fechaC = DateFormat.getDateInstance(DateFormat.SHORT, fEspaol).format(hoy); String fechaM = DateFormat.getDateInstance(DateFormat.MEDIUM, fEspaol).format(hoy); String fechaL = DateFormat.getDateInstance(DateFormat.LONG, fEspaol).format(hoy); String fechaCO = DateFormat.getDateInstance(DateFormat.FULL, fEspaol).format(hoy); DateFormat formato = new SimpleDateFormat("EEEE d 'de' MMMM 'de' yyyy", fEspaol); String fechaLB = formato.format(hoy); System.out.println("Fecha System.out.println("Fecha System.out.println("Fecha System.out.println("Fecha }
La salida es: Fecha corta: 25/07/07 Fecha media: 25-jul-2007 Fecha Larga: 25 de julio de 2007 Fecha Completa: mircoles 25 de julio de 2007 Fecha Libre: mircoles 25 de julio de 2007

corta: " + fechaC + \tFecha media: " + fechaM); Larga: " + fechaL); Completa: " + fechaCO); Libre: " + fechaLB);

76

Java Bsico

Envolventes de tipo, Autoencuadre y Autodesencuadre

77

Envolventes de tipo
A veces necesitaremos representar uno de los tipos primitivos Java como un objeto. Por ejemplo, para pasar un tipo primitivo por referencia a un mtodo. Adems, muchas estructuras de datos Java, como las colecciones, operan sobre objetos, lo que significa que no podemos usarlas para almacenar tipos primitivos. Para manejar estas situaciones, Java proporciona envolventes de tipo (wrappers), que son clases que encapsulan un tipo primitivo dentro de un objeto. Las envolventes de tipo son: Byte, Short, Integer, Long, Float, Double, Character y Boolean.
78

Envolventes de tipo
Casi siempre, suelen tener los siguientes mtodos:

Constructores que reciben un String o un tipo primitivo:


Integer a = new Integer(3);

Convertidores de tipo String a su tipo envolvente numrico:


Integer b = Integer.valueOf(3);

Convertidores de tipo String al tipo primitivo que representan:


int c = Integer.parseInt(3);

Convertidores de un tipo primitivo numrico a String:


String d = Integer.toString(c);

Extractores del tipo primitivo que representan:


int e = b.intValue();
79

Envolventes de tipo
Todas estas conversiones de tipo pueden producir errores. Qu pasara si se intenta crear un Integer utilizando Hola como parmetro?

Siempre que la conversin no sea posible, la JVM lanzar una excepcin (un error) del tipo java.lang.NumberFormatException
Todos las envolventes de tipo sobrescriben el mtodo equals de la clase java.lang.Object. Ejemplo: Integer i1 = new Integer(3); Integer i2 = new Integer(3); System.out.println(i1 == i2); System.out.println(i1.equals(i2)); De esta forma, podemos saber si dos objetos distintos de un mismo tipo envolvente, representan el mismo valor primitivo o no.
80

Clases envolventes de tipo


Mtodos principales de las clases envolventes:
String toString(short s) Short valueOf(String s) float parseFloat(String s) String toString(float f) Float valueOf(String s) double parseDouble(String s) String toStringDouble(duble d) Convierte un valor de tipo short en una cadena Obtiene un objeto Short a partir de una cadena Convierte una cadena numrica en un valor de float Convierte un valor de tipo float en una cadena Obtiene un objeto Float a partir de una cadena Convierte una cadena numrica en un valor double Convierte un valor de tipo double en una cadena

Double valueOf(String s)

Obtiene un objeto Double a partir de una cadena

81

Clases envolventes de tipo


Mtodos principales de las clases envolventes:
int parseInt(String s) String toString(int i) Integer valueOf(String s) double parseDouble(String s) String toString(long i) Long valueOf(String s) byte parseByte(Strint s) String toString(byte b) Byte valueOf(String s) short parseShort(Sring s) Convierte una cadena numrica en un valor int Convierte un valor de tipo int en una cadena Obtiene un objeto Integer a partir de una cadena Convierte una cadena numrica en un valor double Convierte un valor de tipo long en una cadena Obtiene un objeto Long a partir de una cadena Convierte una cadena numrica en un valor byte Convierte un valor de tipo byte en una cadena Obtiene un objeto Byte a partir de una cadena Convierte una cadena numrica en un valor short

82

Clases envolventes de tipo


Ejemplos:
int ao; double numero; String sNumero = 1245.67, cadena; // convierte la cadena 2007 en un valor int ao = Integer.parseInt(2007); // convierte la cadena numrica sNumero en un valor double numero = Double.parseDouble(sNumero); // convierte ao de tipo int a la cadena numrica 2007 cadena = toString(ao);
83

Envolvente de Tipo. Ejemplo


// Uso de clases envolventes public class EnvolventesTest { public static void main(String[] args){ String texto = new String("3"); byte b = Byte.parseByte(texto); System.out.println(Byte.toString(b)); short s = Short.parseShort(texto); System.out.println(Short.toString(s)); int i = Integer.parseInt(texto); System.out.println(Integer.toString(i)); long l = Long.parseLong(texto); System.out.println(Long.toString(l)); float f = Float.parseFloat(texto); System.out.println(Float.toString(f)); double d = Double.parseDouble(texto); System.out.println(Double.toString(d)); } }

92

Autoencuadre / Autodesencuadre
Las funciones autoencuadre y auto-desencuadre convierten tipos primitivos en objetos envolventes de tipo y viceversa. El autoencuadre (autoboxing) encapsula (encuadra) un valor de tipo primitivo en su envolvente del tipo equivalente cuando se requiere un objeto de ese tipo. El auto-desencuadre (auto-unboxing) extrae (desencuadre) el valor de un tipo primitivo de su envolvente de tipo cuando se requiere un valor de ese tipo. Ejemplos:

// Crea un objeto Integer a partir de un int Integer iOb = 100; // autoencuadra un int // Extrae un tipo int de su envolvente
int a = iOb; // autodesencuadra un objeto Integer
93

Autoencuadre / Autodesencuadre
Java realiza el autoencuadre y autodesencuadre de forma automtica.
Esto nos permite tambin operar con los envolventes. Integer a = 10; Integer b = 3; int c = a + b;

Tambin se permiten las comparaciones:


Integer a = 5; int b = 6; if (a == b) System.out.println(Iguales);

El envolvente Boolean se favorece de esta nueva funcionalidad. Antes no poda participar en condiciones, pero ahora si:
Boolean a = true; boolean b = false; Boolean c = a && b;
94

Autoencuadre / Autodesencuadre
El autoencuadre y autodesencuadre tambin ocurre cuando se pasa un argumento a un mtodo o cuando un mtodo devuelve un valor.
public class Autoencuadre { // Este mtodo tiene un parmetro Integer static void m(Integer v){ System.out.println(m() recibi + v); } // Este mtodo devuelve un int static int m2(){ return 10; } // Este mtodo devuelve un Integer static Integer m2(){ return 99; } }

95

Autoencuadre y mtodos
// Uso de autoencuadre y autodesencuadre public static void main(String args[]) // Pasa un int a m(). El valor se autoencuadra a Integer m(100); // El objeto iOb recibe el valor int devuelto por m2() Integer iOb = m2(); System.out.println(m2() devuelve + iOb);

// Llamamos a m3(). Devuelve un valor Integer int i = m3(); System.out.println(m3() devuelve + iOb);
/* Llamamos a Math.sqrt() con iOb. Este se autoencuadra y su valor se convierte a double */ iOb = 100; System.out.println(Raiz cuadrada de iOb es + Math.sqrt(iOb)); }

96

Java Bsico

Enumeraciones

97

Fundamento de la enumeraciones

En su forma ms simple, una enumeracin es una lista de constantes con nombre que definen un nuevo tipo de dato
Un objeto de tipo enumeracin puede contener slo un nmero de valores fijo definidos por la lista. Una enumeracin se crea usando la palabra clave enum.
Ejemplo: enum DiaSemana {LUNES, MARTES, MIERCOLES,JUEVES, VIERNES, SABADO, DOMINGO }

Los identificadores LUNES, MARTES, etc., son constantes de enumeracin. Cada


una se declara como un miembro publico y esttico de DiaSemana. estn declaradas, en este caso del tipo DiaSemana.

El tipo de las constantes de enumeracin es del tipo de enumeracin en el que


98

Fundamento de la enumeraciones
Una vez definida una enumeracin se pueden declarar variables de ese tipo. Sin embargo, aunque las enumeraciones definen un tipo de clase, no es necesario crear una instancia de enum con new. DiaSemana td; // declara una variable de tipo DiasSemana Para asignar un valor de la enumeracin a esta variable heremos: td = DiaSemana.MARTES;

// Asignamos el valor MARTES

Para comparar dos constantes de enumeracin usamos el operador ==.


if (td == DiaSemana.LUNES){ . . . } Switch (td) { case LUNES: . . . case MARTES: . . . . . .

99

Los mtodos values() y valueOf()


Las enumeraciones tienen dos mtodos predefinidos: values() y valueOf().

public static tipo_enum[] values()


public static tipo_enum[] valueOf(String cad) El mtodo values() devuelve un array que contiene una lista con los valores de las constantes de la enumeracin. El mtodo valuesOf() devuelve una constante de enumeracin cuyo valor corresponde con la cadena pasada en cad.

100

Los mtodos values() y valueOf()


Ejemplo:
// Creamos una clase Enumeracin como cualquier otra clase enum Transporte{ COCHE, CAMION, AVION, TREN, BARCO; }
public class EnumDemo{ public static void main(String args[]){ Transporte tp; // declaramos una variable para la enumeracin System.out.println (Todas las constantes de transporte); // uso de values for (Transporte t : Transporte.values()) System.out.println(t); System.out.println(); // uso de valueOf() tp = Trnasporte.valueOf(AVION); System.out.println(tp contiene+ tp); } } 101

Constructores, mtodos, variables de instancia y enumeraciones.


Java implementa las enumeraciones como un tipo de clase. Por lo tanto, una enumeracin puede incluir constructores, mtodos y variables de instancia. Una enumeracin no puede heredar de otra clase, ni ser una superclase. Lo que significa que no puede extenderse. Cuando se define un constructor para enum, se llama automticamente al constructor cuando se declara una variable de ese tipo de enumeracin, sin necesidad de usar new. Cada una de las constantes de enumeracin puede llamar a cualquier mtodo definido en la enumeracin. Cada constante de enumeracin tiene su propia copia para cualquier variable de instancia definida para la enumeracin.
102

Constructores, mtodos, variables de instancia en las enumeraciones.


Ejemplo:
/* Uso de un constructor, una variable de instancia y un mtodo en una enumeracin */ enum Transporte{ /* Entre parntesis se asignan los valores de inicializacin de cada constante de enumeracin */ COCHE(90), CAMION(75), AVION(60), TREN(100), BARCO(30); // variable de instancia private int velocidad; // velocidad tpica // Constructor Transporte(int v) { velocidad = v; } // Mtodo int getVelocidad() { return velocidad} }

103

Constructores, mtodos, variables de instancia en las enumeraciones.


Ejemplo:
// Uso de la enumeracin
public class EnumDemo2{ public static void main(String args[]){ Transporte tp; // variable enumeracin System.out.println (La velocidad tpica de un avin es: + Transporte.AVION.getVelocidad()+ km/h); System.out.println(Velocidad de todos los transportes es ); for (Transporte t : Transporte.values()) System.out.println(t.getVelocidad() + km/h)); } }

104

Constructores, mtodos, variables de instancia en las enumeraciones.


En el ejemplo anterior, cuando se declara la variable tp en main(), se llama al constructor de Transporte (no es necesario usar new) una vez por cada constante especificada. Colocados entre parntesis, se especifican los argumentos del constructor despus de cada constante: COCHE(90),CAMION(75),AVION(60),TREN(100),BARCO(30);

Nota: La lista termina en punto y coma


Estos valores se pasan al parmetro v de Transporte, que luego se asigna a velocidad. Se llama una vez al constructor por cada constante. Cada constante contiene su propia copia de velocidad. Por lo tento, podemos obtener la velocidad de un tipo de transporte al llamar a getVelocidad()

Transporte.AVION.getVelocidad()
105

Las enumeraciones heredan de Enum.


Todas las enumeraciones java.lang.Enum. heredan automticamente de

Esta clase define varios mtodos para todas las enumeraciones: El mtodo ordinal() devuelve un valor que indica la posicin de una constante de enumeracin en la lista de constantes. Este valor se le llama ordinal. Los valores ordinales empiezan en 0. final int ordinal() El mtodo compareTo() compara el valor ordinal de dos constantes de la misma enumeracin. final int compareTo(tipo_enum e)
Tipo_enum es el tipo de enum y e es la constante que se esta comparando con la constante que se invoca. Si esta tiene un valor ordinal igual que e,
comapareTo devuelve cero, en caso contrario devuelve un valor positivo.
106

Java Bsico

Clases predefinidas

107

Todas las clases de java


La definicin de todas las clases Java la podemos encontrar en la siguiente direccin Web, correspondiente a la documentacin de la biblioteca de Java:

http://java.sun.com/j2se/1.5.0/docs/api/allclasses-noframe.html

Definicin de la clase System

108

La clase System
Se trata de una clase con utilidades genricas del sistema. Todos sus atributos y mtodos son estticos. Tiene tres atributos muy utilizados:
public static final PrintStream out; Representa por defecto al stream de salida en pantalla.
public static final InputStream in; Representa por defecto al stream de entrada del teclado. public static final PrintStream err; Representa por defecto al stream de salida de errores.

Mas informacin:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#field_detail
109

La clase System
Y entre sus mtodos ms utilizados estn:
public static Properties getProperties(); Devuelve una instancia de java.util.Properties encapsulando las propiedades del sistema.

public static String getProperty(String key); Devuelve el valor de la propiedad del sistema key, o null si no existiese.
public static long currentTimeMillis(); Devuelve la diferencia de entre la hora actual y la medianoche del 1 de enero de 1970 en milisegundos. public static long nanoTime(); Devuelve la hora actual en nanosegundos. public static void exit(int status); Termina la ejecucin de la JVM devolviendo status como cdigo de retorno (cero significa que todo ha ido bien).

Otros mtodos:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#method_detail 110

La clase System
Ejemplo:
public class SystemTest { public static void main(String[] args){ System.out.println(System.currentTimeMillis()); System.out.println(System.nanoTime()); System.out.println (System.getProperty("java.runtime.name")); System.out.println(System.getProperties()); System.exit(0); System.out.println("Aqu nunca llega."); } }

111

La clase Math
La clase Math proporciona mtodos estticos para realizar operaciones matemticas, trigonomtricas, races cuadradas , potencias, etc. As como las constantes PI y E. Algunos mtodos de la clase Math
abs(n) double acos(double n) double asin(double n) double atan(double n) double atan2(double n) double ceil(double n) double floor(double n) round(n) double rint(double n) Valor absoluto de un nmero Arco coseno de un triangulo en radianes Arco seno de un triangulo en radianes Arco tangente entre PI/2 y PI/2 Arco tangente entre PI y PI Entero ms cercano por encima de n Entero ms cercano por debajo de n Entero ms cercano a n Entero ms prximo a un numero double
112

La clase Math
Algunos mtodos de la clase Math
double cos(double n) double sin(double n) double tan(double n) double exp(double n) double log(double n) max(a,b) min(a,b) double random() double pow(double a, double b) double sqrt(double n) double toDegrees(double n) double toRadians(double n) Coseno de un ngulo en radianes Seno de un ngulo en radianes Tangente de un ngulo en radianes Exponencial de n Logaritmo natural en base e de n Mximo entre dos valores Mnimo dos valores Nmeros aleatorios entre 0 y 1 Potencia de a elevado b Raz cuadrada de n Pasa de radianes a grados Pasa de grados a radianes

Otros mtodos:

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Math.html

113

La clase Math
Ejemplo 1:
public class
Scanner

MathDemo1{
ac = new Scanner(System.in); = sc.nextDouble();

public static void main(){ System.out.print(Introduce una cantidad con decimales: ); double cantidad

System.out.print(Valor inicial: + cantidad);


System.out.print(Valor absoluto: + Math.abs(cantidad)); System.out.print(Aproximacin superior: + Math.ceil(cantidad)); System.out.print(Aproximacin inferior: + Math.floor(cantidad)); System.out.print(Aproximacin ms cercana: + Math.rint(cantidad)); } }
114

La clase Math
Ejemplo 2:
publica class
Scanner int base

MathDemo2{
ac = new Scanner(System.in);

public static void main(){ System.out.print(Introduce un cantidad entera: ); = sc.nextInt(); = sc.nextDouble();

System.out.println(Raz cuadrada: + Math.sqrt(base));


double expo System.out.print(Introduce otra cantidad: ); System.out.print(cantidad + Elevado a + expo + = + Math.pow(base, expo));

}
}

115

La clase Random
La clase Random crea objetos que generan nmeros aleatorios. Mtodos de la clase Random
Int nextInt() Genera nmeros enteros aleatorios positivos y negativos

Int nextInt(int n)
long nextLong()

Genera nmeros enteros int aleatorios entre 0 y n


Genera nmeros enteros long aleatorios positivos y negativos

flaot nextFloat()
double nextDouble() boolean nextBoolean()

Genera nmeros en coma flotante Float aleatorios positivos y negativos


Genera nmeros en coma flotante Double aleatorios positivos y negativos Genera valores booleanos true y false aleatorios

Otros mtodos:

http://java.sun.com/j2se/1.5.0/docs/api/java/util/Random.html

116

La clase Random
Ejemplo:
// Genera nmeros enteros aleatorios entre 0 y 100
public class EnterosAleatorios { public static void main(){ Random aleatorio = new Random(); //crea un objeto Random System.out.println(Diez nmeros aleatorios ); for (int i = 0; i < 10; i++) { // Genera un nmero aleatorio entero entre 0 y 100 System.out.println(aleatorio.nextInt(100)); } } }
117

La clase StringBuffer
StringBuffer es otra clase relacionada con las cadenas de caracteres. Pero estas no son inmutables, por lo tanto, se pueden modificar sus caracteres. Existen distintas formas de crear un StringBuffer:

Mediante su constructor por defecto:


StringBuffer s = new StringBuffer(); // Se inicializa a .

Mediante su constructor con un parmetro de tipo int:


StringBuffer s = new StringBuffer(3); // Capacidad inicial 3.

Mediante su constructor con un parmetro de tipo String:


StringBuffer s = new StringBuffer(Hola);
118

La clase StringBuffer
Para la clase StringBuffer, la primera posicin de la cadena de caracteres es la cero (no la uno). Alguno de sus mtodos: public int indexOf(int ch); Devuelve la primera ocurrencia de ch (-1 si no est). public StringBuffer append(char c); Aade el carcter c al valor del StringBuffer. Este mtodo est sobrecargado varias veces recibiendo como parmetro otros tipos: String, Object, int, float, long public char charAt(int index); Devuelve el carcter de la posicin index
119

La clase StringBuffer
Algunos de sus mtodos

public int length(); Devuelve la longitud de la cadena de caracteres.


public String toString(); Devuelve un String representado por el StringBuffer. public StringBuffer reverse(); Devuelve la cadena invertida. public int capacity(); Devuelve el nmero de caracteres que puede contener sin necesidad de alocar mas memoria. public String substring(int beginIndex); Devuelve un String desde beginIndex hasta el final.

120

La clase StringBuffer
Algunos de sus mtodos public StringBuffer replace(int start, int end, String str); Reemplaza la cadena entre start y end con str. public StringBuffer insert(int offset, char c); Inserta c en la posicin offset de la cadena. Este mtodo est sobrecargado varias veces recibiendo como parmetro a insertar otros tipos: int, float, long public StringBuffer delete(int start, int end); Elimina de los caracteres entre las posiciones start y end. public void setCharAt(int index, char ch); Reemplaza el carcter de la posicin index por ch. Otros mtodos: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StringBuffer.html #method_detail

121

La clase StringBuffer
Ejemplo:
public class StringBufferTest{ public static void main(String[] args){ StringBuffer sb1 = new StringBuffer("abababab"); System.out.println(sb1.length()); System.out.println(sb1.capacity()); sb1.setCharAt(sb1.length()-1,'B'); System.out.println(sb1); sb1.replace(2,3,"AB"); System.out.println(sb1); sb1.insert(4,"CD"); System.out.println(sb1); sb1.delete(0,2); System.out.println(sb1); } }

122

La clase StringBuffer
Ejemplo: public class StringBufferTest { public static void main(String[] args){ StringBuffer sb2 = new StringBuffer(2); System.out.println(sb2.length()); System.out.println(sb2.capacity()); for(int i=0; i<10; i++) sb2.append(i); System.out.println(sb2.length()); System.out.println(sb2.capacity()); System.out.println(sb2); } }
123

La clase StringBuffer
El uso mas habitual es la creacin de Strings cuyo valor se calcula de forma dinmica. Al no ser inmutable, permite la creacin del String final sin otros objetos intermedios que consumirn memoria de forma innecesaria. Por ejemplo: StringBuffer tmp = new StringBuffer(10); for (int i=0; i <10; i++) tmp.append(i); String s = tmp.toString(); Esta vez solo se han creado 2 objetos en memoria: un StringBuffer (el GC puede limpiarlo) y un String.
124

La clase StringBuilder
J2SE 5.0 aade la clase StringBuilder al tratamiento de cadenas de caracteres. Su funcionalidad (constructores y mtodos) es StringBuffer. idntica a la de

La nica diferencia es que sus mtodos no estn sincronizados (veremos qu significa esto en el captulo de threads). Tiene mejor rendimiento que StringBuffer. Mas informacin:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StringBuilder.html
125

La clase StringBuilder
Ejemplo:
public class StringBuilderTest { public static void main(String[] args){ StringBuilder sb = new StringBuilder("0"); System.out.println(sb.length()); System.out.println(sb.capacity()); for(int i=1; i<10; i++) sb.append(i); System.out.println(sb.length()); System.out.println(sb.capacity()); System.out.println(sb); } }

126

La clase StringBuilder
Ejemplo:
public class StringBuilderTest { public static void main(String[] args){ StringBuilder sb = new StringBuilder("0"); System.out.println(sb.length()); System.out.println(sb.capacity()); for(int i=1; i<10; i++) sb.append(i); System.out.println(sb.length()); System.out.println(sb.capacity()); System.out.println(sb); } }

127

La clase Date y GregorianCalendar


La clase Date de Java permite crear objetos que informan de la fecha y hora del sistema. Para ver sus mtodos consultar:

http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Date.html
Las clases Calendar y GregorianCalendar permiten crear objetos que pueden gestionar fechas y tiempos. Mtodos de gregorianCalendar
setTime set get Asigna a un objeto GregorianCalendar, un objeto de la clase Date, con los datos e la fecha y hora del sistema Asigna una fecha cualquiera a un objeto GregorianCalendar Obtiene el da de la semana , mes, ao, horas, minutos y segundos de un objeto GregorianCalendar

getTimeZone Obtiene la franja horaria de un objeto GregorianCalendar

http://java.sun.com/j2se/1.4.2/docs/api/java/util/GregorianCalendar.html
128

La clase Date y GregorianCalendar


Algunos atributos (constantes) de la clase Calendar
Calendar.DAY_OF_WEEK Calendar.DAY_OF_MONTH Calendar.MONTH Calendar.YEAR Calendar.HOUR Nmero de da de la semana: 1 a 7 Da del mes: 1 a 31 Nmero del Mes: 1 a 12 Ao Hora

Calendar.MINUTE
Calendar.SECOND

Minutos
Segundos

Mtodos de la clase Calendar

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html
129

La clase Date y GregorianCalendar


public class Fechas { public static void main(){ Date hoy = new Date(); // creamos un objeto fecha // creamos un objeto gc de la clase GregorianCalendar GregorianCalendar gc = new GregorianCalendar() gc.setTime(hoy); // Asignamos a gc la fecha y hora actual ); System.out.print(Hoy es:

System.out.print(gc.get(Calendar.DAY_OF_MONTH) + -); System.out.print(cg.get(Calendar.MONTH) + -); System.out.print(gc.get(Calendar.MONTH) + -); System.out.print(gc.get(Calendar.YEAR) + a las ); System.out.print(gc.get(Calendar.HOUR) + :); System.out.print(gc.get(Calendar.MINUTE) + :); System.out.print(gc.get(Calendar.SECOND) ); } }

La salida es: Hoy es: 4-6-2007

las 5:40:42

130

Clases DateFormat y SimpleDate Format


DateFormat es una clase que pertenece al paquete java.text y no al paquete java.util, como las vistas anteriormente.
La razn es para facilitar todo lo referente a la internacionalizacin, que es un aspecto muy importante en relacin con la conversin, que permite dar formato a fechas y horas de acuerdo con distintos criterios locales, como el idioma y el pas. Esta clase dispone de mtodos static para convertir Strings representando fechas y horas en objetos de la clase Date, y viceversa.

La clase SimpleDateFormat es la nica clase derivada de DateFormat. Es la clase que conviene utilizar. Esta clase se utiliza de la siguiente forma: se le pasa al constructor un String con el formato que se desea utilizar.

131

La clase Date y GregorianCalendar


Ejemplo:
//* Este programa muestra como se puede formatear una fecha segn las caractersticas de regionalizacin instaladas en el ordenador. El objeto formatoFecha de la clase DateFormat obtiene las propiedades de datos numricos y de fecha del sistema y aplica este estilo al dato fecha obtenido con el objeto hoy de la clase Date. */ public class Fechas2 { public static void main(){

Date hoy = new Date();

// creamos un objeto fecha

DateFormat formatoFecha = DateFormat.getDateInstance(); String fechaLocal = formatoFecha.format(hoy); System.out.print(fechaLocal); } }


132

Java Bsico
Anexo A

Manejo bsico de Excepciones


133

Gestin de excepciones
Una excepcin es un error que se produce en alguna parte de cdigo durante su ejecucin. Las excepciones permite:

Encapsular los errores dentro de las clases Separar el flujo de ejecucin normal del tratamiento de
errores.

Las excepciones pueden ser tratadas o lanzadas en los programas.


134

Jerarqua de clases de excepciones


La clase Throwable describe cualquier clase que pueda ser lanzada como excepcin.
Existen dos tipos de clases Throwable:

Error representa errores de compilacin y errores del sistema. Exception representa excepciones de tratamiento obligatorio
generadas por la aplicacin.

Existe un tipo especial de clases Exception:

RuntimeException representa excepciones de tratamiento NO


obligatorio generadas por la aplicacin.

135

Jerarqua de clases de excepciones


Object
Excepciones producidas por errores de compilacin y del sistema
Todas las clases de excepciones derivan de la clase Throwable

Throwable

Excepciones de tratamiento obligatorio producidas por una aplicacin Excepciones de tratamiento NO obligatorio

Error

Exception

RuntimeException

136

Excepciones verificadas vs. no verificadas


Verificadas (checked):

Su tratamiento es obligatorio y el compilador as lo

chequea. La clase Exception y todas aquellas clases descendientes de esta que no lo sean de RuntimeException

No verificadas (unchecked):

Su tratamiento NO es obligatorio y el compilador no lo


chequea. Todas aquellas clases RuntimeException descendientes de Error o de

137

Captura y manejo de excepciones


Se capturan y manejan mediante los bloques try catch:
try {
// cdigo que puede generar una excepcin } catch (ClaseExcepcion e) {
Excepcin capturada

// cdigo de tratamiento de excepcin


} ... finally { // cdigo que se ejecutan siempre }
139

Captura y manejo de excepciones


// Ejemplo1: Tratamiento de una excepcin

class ExcepcionTratada1 { public static void main ( String args[ ] ) { Scanner teclado = new Scanner(System.in); try { System.out.print(Introduce un nmero: ); String linea = teclado.nextLine(); int num = Integer.parseInt(linea); System.out.println(El numero es + num); } catch (NumberFormatException e){ System.out.println(Error de conversin); } } }
140

Captura y manejo de excepciones


// Ejemplo2: Tratamiento de varias excepciones en un mismo bloque try .. catch
import java.util.*; class Excepcion2 { public static void main ( String args[ ] ) { Scanner teclado = new Scanner(System.in); try { System.out.print(Introduce un nmero: ); String linea = teclado.nextLine(); int a = Integer.parseInt(linea); System.out.print(Introduce otro nmero: ); String linea = teclado.nextLine(); int b = Integer.parseInt(linea); System.out.print(Resultado = a/b); } catch (NumberFormatException e){ System.out.println(Error de conversin); } catch (AritmeticException e) { System.out.println(Divisin por cero); } catch (Exception e) System.out.println(Excepcin desconocida); } } }

141

Lanzamiento de excepciones con throw


Las excepcin RuntimeException y sus descendientes, son excepciones de tratamiento NO obligatorio (no requieren bloque try .. cath), por lo que si no se gestionan y se produce una de ellas, el programa abortar su ejecucin y la maquina virtual java mostrar el mensaje de error correspondiente.
Sin embargo, las excepciones de tratamiento obligatorio, como Exception y sus descendientes (que no lo sean de RuntimeException), requieren obligatoriamente el uso de un bloque try .. catch para capturarlas y tratarlas, y as lo indicar el compilador de Java. Cuando llamamos a un mtodo de la biblioteca de clases de Java, no sabemos de antemano que tipo de excepcin puede generar. Si es de la clase RuntimeException no ser necesario tratarla, pero si es de la clase Exception requerir el uso de un bloque try .. catch; pero, Qu tratamiento le daremos?.
142

Lanzamiento de excepciones con throw


Si un mtodo produce una excepcin de la clase Exception (excepciones obligatorias) y NO le damos un tratamiento especfico en ese mismo mtodo, debemos especificar esta circunstancia para que los mtodos que lo llamen puedan protegerse contra esa excepcin.
Esto lo podemos hacer relanzando la excepcin usando la clusula throw en un bloque try .. catch. Para ello, capturamos la excepcin de la clase Exception con un try .. catch y lanzamos una excepcin RuntimeException que envuelva a Excepcin , pasndole un objeto de esta clase como parmetro:
try {

// cdigo que puede generar la excepcin } catch (Exception e ) { // capturamos la excepcin de la clase Exception // relanzamos la excepcin e como una RuntimeException
throw new RuntimeException( e ) ; }
143

Lanzamiento de excepciones con throw


import java.io.*; class LecturaStringConsola { public static void main(String args[]){ String cadena; BufferedReader br; /*Creamos un objeto BufferedReader, para lectura por teclado, usando el constructor de la clase InputStreanReader (usado para flujos de entrada) el usa un objeto System.in (la consola ) un devuelve un objeto de la clase BufferedReader ( un bfer de lectura)*/ br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Empieza a escribir, 'stop' para salir"); do { /* readLine() lee una cadena de caracteres. Puede lanzar una excepcin de la clase IOException (tratamiento obligatorio), que es un descendiente de Exception, que requiere el uso de un bloque try .. catch */ cadena = br.readLine(); // OJO!!! Esto no compilar System.out.println(cadena); } while(!cadena.equals("*")); }

El compilador requerir que el uso un bloque try.. Catch para tratar la 144 excepcin que pueda generarse

Lanzamiento de excepciones con throw


import java.io.*; // para la clase BufferedReader class LecturaStringConsola { public static void main(String args[]){ String cadena; BufferedReader br; /*Creamos un objeto BufferedReader, para lectura por teclado, usando el constructor de la clase InputStreanReader (usado para flujos de entrada) el usa un objeto System.in (la consola ) un devuelve un objeto de la clase BufferedReader ( un bfer de lectura)*/

br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Empieza a escribir, 'stop' para salir");


//leemos una cadena de caracteres mediante readLine() do { try{ En lugar de tratar la excepcin, cadena = br.readLine(); la relanzamos, lanzando una System.out.println(cadena); } catch (Exception e){ RuntimeException que throw new RuntimeException(e); envuelva la posible excepcin } de la clase Exception que } while(!cadena.equals("*")); pueda producirse. } 145

S-ar putea să vă placă și