Professional Documents
Culture Documents
1. Clases y Objetos
1.1. Introduccin 1.2. Implementacin, declaracin e instanciacin 1.3. Borrado de objetos: el Garbage Collector
Declaracin de objetos:
NombreClase nombreObjeto; Complejo c;
c2
! Podemos
class Ejemplo2 { public static void main(String[] args) { Complejo c1 = new Complejo(); Complejo c2 = new Complejo(); double mod; c1.real c1.imag c2.real c2.imag = = = = 4; 3; 5; 1;
mod = Math.sqrt(c1.real*c1.real + c1.imag*c1.imag); System.out.println(El mdulo es + mod); mod = Math.sqrt(c1.real*c1.real + c1.imag*c1.imag); System.out.println(El mdulo es + mod); } }
12
! Ventajas:
! El programador no tiene que preocuparse de liberar la memoria. ! Se evitan los problemas ocasionados por el olvido de liberar los objetos inservibles.
! Desventajas:
! No se tiene un control total sobre el uso de la memoria (no se sabe en qu momento exacto actuar el garbage collector).
13
2. Mtodos
2.1. Introduccin 2.2. Constructores 2.3. Objetos como argumentos 2.4. La referencia this 2.5. Pase de parmetros: por valor o referencia? 2.6. Devolucin de objetos 2.7. Sobrecarga de mtodos
14
! Ms adelante se ver que delante de tipo_dato puede aparecer un modificador de acceso. ! Los mtodos pertenecen siempre a una clase determinada, y slo tienen sentido dentro de la misma. ! Habitualmente, su cometido es acceder a los atributos de la clase.
15
16
17
real e imag no hacen referencia a una variable concreta. Son los atributos real e imag de algn objeto de tipo Complejo, pero, de cul?
18
class Complejo { double real; // Estas variables no existirn hasta que double imag; // no creemos algn objeto de tipo Complejo double modulo() { return Math.sqrt(real*real + imag*imag); } } class Ejemplo3 { public static void main( String[] args ) { Complejo c1 = new Complejo(); c1.real=4; c.imag=3; Complejo c2 = new Complejo(); c2.real=5; c2.imag=1; double mod1 = c1.modulo(); double mod2 = c2.modulo(); } }
El mtodo modulo opera, en cada caso, con los atributos de un objeto distinto Complejo Complejo real=5 real=4 c2 c1 19 imag=1 imag=3
20
21
2.2 Constructores
! Los constructores son unos mtodos especiales que se ejecutan en el momento de crear los objetos. ! Su funcin principal es la de inicializar el nuevo objeto que se est creando. ! El constructor tiene el mismo nombre que la clase donde se define. ! No tiene tipo de dato de retorno, ni siquiera void. ! Cuando en Java se crea un objeto, se invoca explcitamente al constructor de dicho objeto. Complejo c; c = new Complejo(); // Se invoca al constructor
22
2.2 Constructores
! Todas las clases tienen un constructor por defecto sin parmetros. class Complejo { double real, imag; Complejo() { } // Constructor por defecto. No // hara falta escribirlo
double modulo() { . . . } ! El constructor por defecto permite llevar a cabo la instanciacin de objetos, pero no realiza ninguna inicializacin de los atributos.
23
2.2 Constructores
! Es posible implementar nuestro propio constructor: class Complejo { double real, imag; Complejo() { real = 1; imag = 0; } . . . } ! Ahora, cuando se creen objetos de tipo Complejo, los atributos se inicializarn segn lo especificado en el constructor.
24
2.2 Constructores
! Los constructores pueden recibir parmetros: class Complejo { double real, imag; Complejo(double r, double i) { real = r; imag = i; } . . . ! En este caso el constructor por defecto sin parmetros se pierde. Complejo c; c = new Complejo(); //Error. No c = new Complejo(2,3); // Crea
26
27
! En este contexto this referencia al objeto c1 y c al objeto c2. ! La referencia this puede omitirse (es lo habitual).
28
29
real=5 imag=1
v
30
c1 c2 c
31
Nave(int x, int y, int d) { posX=x; posY=y; direccion=d; operativa=true; } void dispara(Nave otraNave) { if( alineados(posX, posY, direccion, otraNave.posX, otraNave.posY ) ) otraNave.operativa = false; } boolean alineados(int x1, int y1, int ang, int x2, int y2){ . . . }
class Juego { public static void main(String [] args) { Nave nave1 = new Nave(50, 50, 0); Nave nave2 = new Nave(200, 50, 180); nave1.dispara(nave2); // Se modifica el estado de nave2! } 33 }
class Ejemplo6 { public static void main(String [] args) { Complejo c1 = new Complejo(2,3); Complejo c2 = new Complejo(5,1); Complejo c3; } c3 = c1.suma(c2); // c3 = c1 + c2
A qu variables hacen referencia real, c.real, imag, c.imag en el mtodo suma? Dnde se crea el objeto c3?
34
class Ejemplo7 { public static void main(String [] args) { Complejo c1 = new Complejo(2,3); Complejo c2 = new Complejo(5,1); Complejo c3, c4; c3 = c1.multiplica(3); c4 = c1.multiplica(c2);
35
} class Ejemplo8 { public static void main(String [] args) { Complejo c1 = new Complejo(); Complejo c2 = new Complejo(5,1); Complejo c3 = new Complejo(c2); } }
36
El siguiente cdigo no es correcto: class Sobrecarga { void test (int a, int b) { . . . } int test (int a, int b) { . . . }
37
! Un constructor nicamente puede invocarse desde otro constructor. ! Para invocarlo no se utiliza el nombre del constructor, sino this() ! En caso de utilizar this(), sta debe de ser la primera instruccin del constructor.
38
! En caso de que el atributo esttico se inicialice durante la declaracin, esta inicializacin se hace una nica vez (no cada vez que se cree un objeto). ! Pueden ser accedidos sin necesidad de crear ninguna instancia (objeto). ClaseConAtrEstatico.atributoEstatico = 1;
40
} class Ejemplo9 { public static void main(String [] args) { ClaseConAtrEstatico obj1 = new ClaseConAtrEstatico(); ClaseConAtrEstatico obj2 = new ClaseConAtrEstatico(); System.out.println(cont obj1 = + obj1.cont); System.out.println(cont obj2 = + obj2.cont); System.out.println(cont = + ClaseConAtrEstatico.cont); } }
} class Ejemplo10 { public static void main(String [] args) { ClaseConAtrEstatico obj1 = new ClaseConAtrEstatico(); ClaseConAtrEstatico obj2 = new ClaseConAtrEstatico(); ClaseConAtrEstatico.reseteaContador(); ClaseConAtrEstatico obj3 = new ClaseConAtrEstatico(); } }
! Cul es la salida del programa anterior? ! Implementa la suma de nmeros complejos mediante un mtodo de instancia y otro esttico.
43
5. Encapsulacin
! En ocasiones resulta interesante ocultar algunos detalles sobre la implementacin de una clase.
! Permite un mayor control sobre el acceso a los atributos. ! Cdigo ms robusto. ! Facilita posteriores modificaciones.
44
5. Encapsulacin
! El modificador de acceso private permite ocultar atributos y/o mtodos, mientras que public los hace visibles.
class Conjunto { private double [] v = new double[1000]; private int numElementos = 0; public void insertar( double elem ) { v[numElementos++] = elem; } public void mostrar() { for( int i=0; i<numElementos; i++ ) System.out.println( v[i] ); }
! Interesa que desde otras clases no se tenga acceso a los atributos v y numElementos. ! Cdigo ms robusto. Facilita modificaciones posteriores (p. ej. implementacin mediante listas enlazadas). ! Si no se especifica ningn modificador de acceso, decimos que el miembro es friendly (acceso pblico a objetos de cualquier clase definida en el mismo paquete).
45
5. Encapsulacin
! Es muy recomendable declarar los atributos privados y, si es necesario, dar acceso a travs de mtodos pblicos (getter y setter).
class Circulo { private double radio; public void setRadio( double r ) { if( r > 0 ) radio = r; else radio = 0; } public double getRadio() { return radio; }
} class Ejemplo11 { public static void main( String [] args ) { Circulo c = new Circulo(); c.radio = -1; // Error de acceso. Atributo privado c.setRadio(-1); // Control de errores. El atributo // radio tomar el valor 0 } }
46
! La clase anidada slo es visible para la clase que la contiene. ! Las clases internas tienen acceso a todos los miembros (incluso a aquellos privados) de la clase que la contiene (outer class). ! Las clases internas pueden definirse tambin dentro de un mtodo. En este caso slo tiene acceso a los atributos de la outer class que tengan modificador final. ! Este tipo de clases se usan habitualmente para implementar manejadores de eventos (se ver en el Tema 6).
47
7. Paquetes
! Las clases se organizan en paquetes. ! Los paquetes permiten mantener el espacio de nombres dividido: no puede haber dos clases con el mismo nombre en el mismo paquete, pero s en paquetes distintos. ! Tambin afectan a la visibilidad de atributos y mtodos:
! Miembro public: accesible desde cualquier clase de cualquier paquete. ! Miembro friendly (sin modificador de acceso): accesible desde cualquier clase del mismo paquete.
! Para definir un paquete debe ponerse en la primera lnea del fichero fuente:
package nombre_del_paquete;
! Todas las clases de dicho fichero fuente formarn parte del paquete nombre_del_paquete. ! Si se omite la sentencia package, las clases se asocian al paquete por defecto, que no tiene nombre.
48
7. Paquetes
! Los paquetes pueden agruparse a su vez en otros paquetes, estructurndose as de forma jerrquica. ! La siguiente sentencia define el paquete2 dentro del paquete1.
package paquete1.paquete2;
! Para poder utilizar las clases definidas en un paquete determinado, es necesario importarlas. ! La siguiente sentencia importa todas las clases definidas en el paquete java.util.
import java.util.*;
! El paquete java.lang contiene clases fundamentales de Java (Object, String, ) y no es necesario importarlo.
49
8. La clase String
! Permite el manejo de cadenas de caracteres.
String s = new String(Esto es una cadena);
! Se trata de una clase especial, ya que permite crear objetos sin necesidad de utilizar la sentencia new.
String s = Esto es una cadena;
! Tambin es posible la concatenacin con variables de tipos bsicos (int, float, boolean ), en cuyo caso se obtiene una representacin en forma de cadena de la variable en cuestin.
int x=10; System.out.println(x = + x);
50
8. La clase String
! Algunos mtodos de la clase String:
! int length(): devuelve la longitud de la cadena. ! char charAt( int indice ): devuelve el carcter de la posicin indicada. ! boolean equals( String s ): comprueba si la cadena que invoca el mtodo es igual a la cadena s pasada como parmetro. ! boolean equalsIgnoreCase( String s ): similar a equals, pero sin diferenciar entre maysculas y minsculas. ! boolean startsWith( String s ): comprueba si la cadena que invoca el mtodo comienza con una subcadena igual a la cadena s. ! String substring( int beginIndex, int endIndex): devuelve una nueva cadena compuesta por los caracteres que se encuentran entre los dices especificados.