You are on page 1of 51

3.

- Fundamentos de la POO con Java


1.! 2.! 3.! 4.! 5.! 6.! 7.! 8.! Clases y objetos Mtodos Atributos estticos (de clase) Mtodos estticos (de clase) Encapsulacin Clases anidadas o internas Paquetes La clase String
1

1. Clases y Objetos
1.1. Introduccin 1.2. Implementacin, declaracin e instanciacin 1.3. Borrado de objetos: el Garbage Collector

1.1.- Introduccin (las clases)


! Una clase es un tipo de datos que describe una familia de objetos. ! Clase = atributos (variables) + mtodos (funciones) ! Los atributos almacenan el estado ! Ej. Atributos de la clase Ventana:
int posX, posY, sizeX, sizeY; boolean maximizada, minimizada;

! Los mtodos definen el comportamiento ! Ej. Mtodos de la clase Ventana:


void void void void mover(int despX, int despY) redim(int newSizeX, int newSizeY) maximizar() minimizar()

1.1.- Introduccin (las clases)


Sintaxis:
class Nombre_de_clase { // Atributos [modificador] tipo_dato atributo1, atributo2, ...; [modificador] tipo_dato ...; // Mtodos [modificador] tipo_dato metodo1 ( lista_argumentos ) { // cuerpo del metodo1 } [modificador] tipo_dato metodo2 ( lista_argumentos ) { // cuerpo del metodo2 } ... }
4

1.1.- Introduccin (las clases)


Ejemplo:
class Ventana { // Atributos int posX, posY, sizeX, sizeY; boolean minimizada, maximizada; // Mtodos void inicializar () { posX=0; posY=0; sizeX=400; sizeY=300; minimizada=false; maximizada=false; } void mover (int despX, int despY) { posX+=despX; posY+=despY; } void redim(int newSizeX, int newSizeY) { sizeX=newSizeX; sizeY=newSizeY; } . . . }

1.1.- Introduccin (los objetos)


! Los objetos son instancias o ejemplares concretos de una clase. ! Cada objeto dispone de su propio espacio de memoria donde almacenar los valores de sus atributos. ! Los mtodos se ejecutan (habitualmente) sobre un objeto determinado. Normalmente consultan y/o modifican los atributos (el estado) de dicho objeto. ! Una aplicacin OO puede verse como un conjunto de objetos que se crean y destruyen. stos van cambiando de estado en funcin de los mtodos que se ejecuten.
6

1.2.- Implementacin, declaracin e instanciacin


! En una aplicacin OO tenemos que: 1.! Implementar las clases que necesitemos. 2.! Declarar e instanciar (crear) los objetos. ! A partir de aqu estamos en disposicin de empezar a utilizar los objetos a travs de sus mtodos. Implementacin de una clase:
class NombreDeLaClase { // Atributos . . . // Mtodos . . . }

1.2.- Implementacin, declaracin e instanciacin


Ejemplo de implementacin de una clase sin mtodos:
class Complejo { double real; double imag; }

Declaracin de objetos:
NombreClase nombreObjeto; Complejo c;

Se crea una referencia, pero el objeto todava no existe!


c NULL
8

1.2.- Implementacin, declaracin e instanciacin


Instanciacin de una clase (creacin de objetos):
nombreObjeto = new NombreClase(); c = new Complejo();

Es habitual declarar y crear el objeto en la misma sentencia:


Complejo c; c = new Complejo(); Complejo c = new Complejo(); Complejo real imag
9

1.2.- Implementacin, declaracin e instanciacin


Es posible tener ms de una referencia a un mismo objeto:
Complejo c1, c2; c1 = new Complejo(); c2 = c1;

Complejo c1 real imag

c2

Podemos acceder al objeto creado tanto a travs de c1 como de c2.


10

Acceso a los miembros de un objeto:


nombreObjeto.miembro
class Complejo { double real; double imag; } class Ejemplo1 { public static void main(String[] args) { Complejo c = new Complejo (); double mod; c.real = 4; c.imag = 3; mod = Math.sqrt(c.real*c.real + c.imag*c.imag); System.out.println(El mdulo es + mod); } }
11

! Podemos

crear ms de un objeto de un mismo tipo (clase)

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

1.3.- Borrado de objetos: el garbage collector


! Creacin de objetos (y vectores) mediante new. ! No existe un operador delete (C++) o free (C) para su destruccin. ! Se hace automticamente, no hay que preocuparse de ello. ! Funcionamiento:
! Existe un proceso denominado garbage collector que rastrea los objetos de nuestro programa. ! Cuando se detecta un objeto del que no existe ninguna referencia, se asume que dicho objeto no ser utilizado. En este caso el garbage collector lo borra (libera la memoria).

! 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

2.1 Mtodos: introduccin


! Los mtodos son el equivalente a las funciones o procedimientos de otros lenguajes. ! Su sintaxis es similar a la de las funciones en C.
tipo_dato nombre ( lista_argumentos ) { // Cuerpo del mtodo }

! 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

2.1 Mtodos: introduccin


! Ejemplo de una clase con mtodos y atributos: class Complejo { double real; double imag; double modulo() { return Math.sqrt(real*real + imag*imag); } } ! El objetivo de la POO es dotar a las clases (y por tanto a los objetos) de toda la funcionalidad que puedan llevar a cabo.

16

2.1 Mtodos: introduccin


! A la hora de decidir qu mtodos implementar en una clase determinada, es una buena estrategia pensar qu mtodos tienen sentido en dicha clase, y no nicamente qu mtodos necesito para solucionar un problema determinado. ! Estrategia: implementar todos los mtodos que tengan sentido en esa clase. Posiblemente los necesite en un futuro. ! Reutilizacin de cdigo. ! Qu operaciones pueden hacerse con un nmero complejo? ! mdulo, fase, conjugado, suma, resta, producto, division

17

2.1 Mtodos: introduccin


Dado el siguiente ejemplo:
class Complejo { double real; double imag; double modulo() { return Math.sqrt(real*real + imag*imag); } }

Es importante entender que en la instruccin


Math.sqrt(real*real + imag*imag);

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

2.1 Mtodos: introduccin


Para consultar o modificar los atributos de una clase, es habitual hacerlo a travs de mtodos y no directamente. Para ello se suelen implementar los mtodos denominados getter y setter. class Complejo { double real; double imag; void setReal (double re) { real = re; } void setImag (double im) { imag = im; } double getRreal() { return real; } double getImag() { return imag; } double modulo() { return Math.sqrt(real*real + imag*imag); } }

20

2.1 Mtodos: introduccin


class Ejemplo4 { public static void main( String[] args ) { Complejo c = new Complejo(); c.setReal(4); c.setImag(3); System.out.println( c.getReal()+ ++c.getImag()+i); System.out.println( Mdulo=+c.modulo() ); } } Esta forma de trabajar facilita la encapsulacin, como se ver ms adelante.

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

existe const. sin parmetros el complejo 2+3i


25

2.3 Objetos como argumentos


! Un mtodo tambin puede recibir objetos como argumentos.
class Complejo { double real, imag; Complejo(double r, double i) {real=r; imag=i;} void suma(Complejo c) { real += c.real; imag += c.imag; } } class Ejemplo5 { public static void main(String[] args) { Complejo c1 = new Complejo(2,3); Complejo c2 = new Complejo(5,1); c1.suma(c2); // c1 = c1 + c2 . . . } }

26

2.3 Objetos como argumentos


! Ejercicio: implementar un mtodo equals que permita saber si dos nmeros complejos son iguales. ! Cul ser la salida del siguiente programa?
class Ejemplo6 { public static void main(String [] args) { Complejo c1 = new Complejo(5,1); Complejo c2 = new Complejo(5,1); if( c1.equals(c2) ) System.out.println(Los else System.out.println(Los if( c1 == c2 ) System.out.println(Las else System.out.println(Las } } objetos c1 y c2 son iguales); objetos c1 y c2 son distintos); referencias c1 y c2 son iguales); referencias c1 y c2 son distintas);

! Es importante saber diferenciar entre la referencia a un objeto y el contenido de un objeto.

27

2.4 La referencia this


! La palabra reservada this es una referencia al objeto que invoc el mtodo.
Complejo c1 = new Complejo(3,2); Complejo c2 = new Complejo(5,1); if( c1.equals(c2) ) { . . . } Class Complejo { . . . boolean equals( Complejo c ) { return( this.real==c.real && this.imag==c.imag ); } }

! En este contexto this referencia al objeto c1 y c al objeto c2. ! La referencia this puede omitirse (es lo habitual).
28

2.4 La referencia this:ocultacin de atributos


! Cuando coincide el nombre de un parmetro y un atributo, este ltimo queda ocultado por el primero. class Complejo { double real, imag; Complejo(double real, double imag) { // Los atributos han quedado ocultados por // los parmetros } ! Se puede utilizar this para acceder a los atributos. class Complejo { double real, imag; Complejo(double real, double imag) { this.real = real; this.imag = imag; }

29

2.5 Pase de parmetros: por valor o por referencia?


! Debe tenerse claro la diferencia entre variables de tipos bsicos y referencias a objetos o vectores.

int i = 2; Complejo c = new Complejo(5,1); int [] v = new int[5];

real=5 imag=1

v
30

2.5 Pase de parmetros: por valor o por referencia?


! En Java el pase de parmetros es siempre por valor. ! En el caso de objetos o vectores, se pasa por valor la referencia al objeto o vector.
class Complejo { . . . void un_metodo(Complejo c) { . . . } }i 2 class Ejemplo5 { public static void main(String[] args) { Complejo c1 = new Complejo(2,3); Complejo c2 = new Complejo(5,1); c1.un_metodo(c2); . . .

c1 c2 c

real=2 imag=3 real=5 imag=1

31

2.5 Pase de parmetros: por valor o por referencia?


class Test { void modificar(int i) { i *= 2; } } class LlamadaValor { public static void main(String [] args) { Test ob = new Test(); int a = 15; System.out.println(a = + a); ob.modificar(a); System.out.println(a = + a);

Salida del programa: a = 15 a = 15


32

class Nave { int posX, posY, direccion; boolean operativa;

2.5 Pase de parmetros: por valor o por referencia?

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 }

2.6 Devolucin de objetos


class Complejo { float real, imag; Complejo(float r, float i) { real = r; imag = i; } Complejo suma( Complejo c ) { Complejo res = new Complejo(real+c.real, imag+c.imag); return res; }

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

2.7 Sobrecarga de mtodos


! Es posible crear, dentro de una misma clase, mtodos con el mismo nombre y distinto nmero y/o tipo de parmetros. ! En este caso se dice que el mtodo est sobrecargado.
class Complejo { . . . Complejo return } Complejo double double return } multiplica( double n ) { new Complejo(real*n, imag*n); multiplica( Complejo c ) { x = real*c.real - imag*c.imag; y = real*c.imag + imag*c.real; new Complejo(x,y);

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

2.7 Sobrecarga de mtodos


! Tambin es posible (y muy habitual) sobrecargar los constructores.
class Complejo { double real, imag; Complejo() { real = 0; imag = 0; } Complejo( double r, double i ) { real = r; imag = i; } Complejo( Complejo c ) { real = c.real; imag = c.imag; }

} class Ejemplo8 { public static void main(String [] args) { Complejo c1 = new Complejo(); Complejo c2 = new Complejo(5,1); Complejo c3 = new Complejo(c2); } }

36

2.7 Sobrecarga de mtodos


! Dos mtodos sobrecargados no pueden diferenciarse nicamente en el tipo de dato devuelto.

El siguiente cdigo no es correcto: class Sobrecarga { void test (int a, int b) { . . . } int test (int a, int b) { . . . }

37

2.7 Sobrecarga de mtodos


! Invocacin de constructores mediante this.
class Complejo { double real, imag; Complejo( double r, double i ) { real = r; imag = i; } Complejo() { this(0,0); } Complejo( Complejo c ) { this(c.real, c.imag); }

! 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

3. Atributos estticos (de clase)


! Hasta ahora se ha visto que los atributos pueden tener valores distintos en distintos objetos ! atributos de instancia. ! Cada objeto dispone de su propio espacio de memoria donde albergar los atributos de instancia. ! Es posible definir atributos cuyo valor sea comn a todos los objetos ! atributos estticos (o de clase). ! Un atributo esttico ocupa un espacio de memoria nico y comn para todos los objetos de la clase donde se define. ! Si un objeto modifica el valor de un atributo esttico, la modificacin afecta a todos los objetos de la misma clase.
Atr. esttico

Atr. instancia Atr. instancia

Atr. instancia Atr. instancia

Atr. instancia Atr. instancia


39

3. Atributos estticos (de clase)


! Los atributos estticos se declaran mediante la palabra reservada static. class ClaseConAtrEstatico { static int atributoEstatico = 0; . . .

! 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

3. Atributos estticos (de clase)


class ClaseConAtrEstatico { static int cont = 0; ClaseConAtrEstatico () { cont++; System.out.println(Creado objeto n + cont); }

} 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); } }

Creado objeto n 1 Creado objeto n 2 cont obj1 = 2 cont obj2 = 2 cont = 2


41

4. Mtodos estticos (de clase)


! Los mtodos estticos pueden invocarse sin necesidad de crear objetos de la clase donde estn definidos. NombreDeClase.nombreMetodoEstatico(. . .); ! En los mtodos estticos no puede aparecer ni explcita ni implcitamente la referencia this. ! Suelen utilizarse cuando la operacin que realizan no est relacionada con el estado de un objeto particular o en clases que carecen de atributos (Math). ! Los mtodos estticos son similares a las funciones procedimientos de los lenguajes no orientados a objetos. o
42

4. Mtodos estticos (de clase)


class ClaseConAtrEstatico { static int cont = 0; ClaseConAtrEstatico () { cont++; System.out.println(Creado objeto n + cont); } static void reseteaContador() { cont = 0; }

} 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.

mtodo pblico mtodo pblico mtodo pblico

atributo privado atributo privado mtodo privado

! 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

6. Clases anidadas o internas


! Las clases anidadas (nested classes) o internas (inner classes) son clases definidas dentro de otras.
class Externa { . . . class Interna { . . . } }

! 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.*;

! La siguiente sentencia importa nicamente la clase LinkedList definidas en el paquete java.util.


import java.util.LinkedList;

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

! Es posible concatenar strings mediante el operador +.


String s1 = Hola ; String s2 = Mundo; String s3 = s1+s2;

! 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.

! Se recomienda consultar el API de Java para consultar otros mtodos disponibles.


51

You might also like