Documente Academic
Documente Profesional
Documente Cultură
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
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
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.
+ area);
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
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
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
Color
Objeto rect1
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
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
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.
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
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
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
modificador miembro_clase
El modificador protected slo se aplica cuando se utiliza herencia; lo explicaremos en el tema de herencia.
35
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
37
// 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.
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;
. . .
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
48
49
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
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
52
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
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
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.
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); }
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
corta: " + fechaC + \tFecha media: " + fechaM); Larga: " + fechaL); Completa: " + fechaCO); Libre: " + fechaLB);
76
Java Bsico
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:
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
Double valueOf(String s)
81
82
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;
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 }
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;
99
100
103
104
Transporte.AVION.getVelocidad()
105
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
http://java.sun.com/j2se/1.5.0/docs/api/allclasses-noframe.html
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
La clase Math
Ejemplo 2:
publica class
Scanner int base
MathDemo2{
ac = new Scanner(System.in);
}
}
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()
flaot nextFloat()
double nextDouble() boolean nextBoolean()
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:
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
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
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
http://java.sun.com/j2se/1.4.2/docs/api/java/util/GregorianCalendar.html
128
Calendar.MINUTE
Calendar.SECOND
Minutos
Segundos
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html
129
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) ); } }
las 5:40:42
130
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
Java Bsico
Anexo A
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.
Error representa errores de compilacin y errores del sistema. Exception representa excepciones de tratamiento obligatorio
generadas por la aplicacin.
135
Throwable
Excepciones de tratamiento obligatorio producidas por una aplicacin Excepciones de tratamiento NO obligatorio
Error
Exception
RuntimeException
136
chequea. La clase Exception y todas aquellas clases descendientes de esta que no lo sean de RuntimeException
No verificadas (unchecked):
137
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
141
// 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
El compilador requerir que el uso un bloque try.. Catch para tratar la 144 excepcin que pueda generarse