You are on page 1of 12

Alfonso Gmez-Jordana 100276950

TEMA 6. OBJETOS
Una clase es una agrupacin de mtodos y variables, que estn ms o menos relacionados. Ejemplos de clases pueden ser, si estamos haciendo un juego de ajedrez, una clase tablero, que tenga las variables de que casillas estan ocupadas, una clase por cada tipo de ficha, (es decir, una clase pen, otra alfil bla bla, pero no ocho clases pen, dos clases alfil...), que tenga por ejemplo una variable que dice si es blanca o negra, otra que dice en que posicion est, un mtodo mover que indica todas las posibles casillas a las que puede moverse y le deja moverse a una etc.. Tambin podra haber una clase jugador, y algn otro que se nos ocurra. Ahora, estas clases son como moldes, que a la hora de jugar, tenemos que instanciar (se llama as a crear un nuevo objeto a partir del molde). Por ejemplo, de la clase jugador, crearamos dos objetos (se llama clase al molde, objetos a las copias que hacemos a partir de la clase), porque hay dos jugadores jugando. De la clase pen, crearamos 16 objetos: ocho negros y ocho blancos. En cambio de la clase tablero solo crearamos un objeto.

TEMA 6. OBJETOS Definicin de clases Creacin de objetos Estructura de una clase Constructor Atributos De instancia (objeto): De clase: Mtodos De instancia (objeto): De clase: Pasar por parmetros: Destructor Leer adems...

Definicin de clases
Una clase se crea como un bloque (empieza por { y acaba por }) que dentro tiene todas las variables y metodos y eso. Ejemplo public class Cacafuti{ int caca; String futi = futi; public int sumar(){ return 1+1; } } Lo nico as misterioso, es lo que se pone antes del bloque: en este caso public class cacafuti. Vamos parte por parte public: Esto puede ser o public, como en este caso, o package. Las public son como las ms importantes, que se ejecutan y eso, y como mucho puede haber una public en cada arvhico .java (que es cada pestaa que abras en netbeans o eclipse, por ejemplo). Las package, son otras clases que puedes meter en un mismo .java que otra public (o sn que haya otra public), o bien para apoyarla con lo que sea, o porque no tienen que ejecutarse, y solo por ejemplo guardan datos, o yo que s, nunca las he usado! class: esto se pone siempre en medio Cacafuti: es el nombre de la clase. Se pone con la primera en maysculas (sino no pasa nada, pero da imagen de que no tienes ni idea). Como es el nombre de una clase, es decir, como de un molde, tiene que tener un nombre medio general: por ejemplo, si es un pen, pues Peon, y no peonb5, o Alumno, y no pepito_sanchez.

Creacin de objetos
New: cuando queremos sacar un nuevo objeto de la clase, podemos hacerlo escribiendo (Peon es el nombre de la clase, peonb3 es el nombre del objeto pen, que ser blanco y el 3o de este jugador): Peon peonb3 = new Peon(); Referenciar: o tambin podemos coger y hacer un nuevo pen a partir de otro objeto pen, en lugar de del molde, escribiendo

Peon peonb3 = peonb2; Pero esto es una mierda, porque entonces, ahora siempre que cambiemos algo en peonb3, por ejemplo, lo movemos, tambin se cambiar en peonb2, es decir, se mover. Y tambin pasa al revs, si tocamos el 2 se cambia el 3. Vamos, que lo nico que ests haciendo prcticamente es que a peon2b, que ya exista, ahora puedes llamarlo tambin peonb3, vamos que peonb2 y peonb3 en realidad son el mismo peon. Esto a veces nos sirve, pero es algo avanzado, as que de momento solo habria que quedarse con que lo suyo es crear cada objeto usando new bla bla(). Y si quieres iniciar un objeto copiando a otro que ya existe? Creo que hay algn mtodo, igual que hay System.ArrayCopy() o algo as para arrays, pero para objetos. De todas formas, no entra en el temario.

Estructura de una clase


Constructor
Cuando creamos un objeto a travs de una clase, automticamente se ejecuta un mtodo de esa clase: el constructor. Entonces, este mtodo, normalmente, se suele usar para inicializar valores de un objeto.
NOTA: Es posible no escribir ningn constructor a una clase. En ese caso, al inicializarse un objeto, pues no se ejecuta ningn constructor, porque no hay, fin.

Vamos a ver un ejemplo de cosntructores con el pen: Clase pen: public class Peon{ String color; int casilla; public Peon(String colorPeon, int casillaPeon){ color = colorPeon; casilla = casillaPeon; } } Cuando creamos un nuevo objeto pen desde la clase principal: public class PartidaAjedrez{ public static void main(String args[]){ Peon peonb5 = new Peon(Blanco, 37); //Creamos un nuevo pen que sea blanco y est en la casilla 37. } } Vale, eso era. Ahora por partes vamos a explicarlo. El constructor es el mtodo public Peon. Es importante ver que: El mtodo siempre es public, por lo menos segn tengo entendido. Desde luego no van a pedir que pongis otra cosa ah. Adems, no hay que poner despus de public ni static ni tipo de retorno (=void, o int, o lo que sea) porque no puede devolver nada. No puede tener return el constructor dentro (que yo sepa, como siempre jajaj)!

El nombre del constructor TIENE que ser igual al nombre de la clase, incluyendo maysculas y todo eh! Ahora, lo que este constructor hace en concreto es coger el String colorPeon y el int casillaPeon (que en este caso, al crearlo desde el main, hemos elegido que sean Blanco y 37) y rellenar con esos valores las variables color y casilla del objeto peonb5. Para hacer esto mismo de forma ms profesional, se suele escribir el constructor as: public Peon(String color, int casilla){ this.color = color; //El this.color hace referencia al color del objeto, el

//otro al que le hemos pasado por argumentos


this.casilla = casilla; } Hemos cambiado colorPeon y casillaPeon por color y casilla. El problema es que ahora habra un lo de variables, porque por un lado tendramos la variable color de toda la clase Peon, y por otro lado la variable color que pasamos por argumento al constructor, y lo mismo con casilla. Por eso, se usa, como veis arriba, this.. Qu hace exactamente? Pues que si pones this.color por ejemplo, entonces el programa sabe que te refieres a la variable color de fuera, del objeto, y no la del costructor nueva. Sobrecarga de constructores Los constructores, como cualquier mtodo, pueden tener sobrecarga: puede haber varios constructores a la vez en una misma clase (es decir, muchos mtodos que se llamen igual que la clase), pero, eso s, todos con distintos argumentos dentro del parntesis (recordar que lo que tiene que ser distinto es, o bien el tipo de los argumentos, o bien el nmero de argumentos que haya, pero si cambia el nombre de los argumentos y no el tipo y le nmero, no hay sobrecarga, sino que no compila: EST MAL). Por ejemplo puede haber a la vez: public Peon(String color, int casilla){ ... } public Peon(String color, int casilla, int altura){ //Cambia el nmero ... } public Peon(double color, int casilla){ //Cambia un tipo ... } public Peon(int casilla, String color){ //Esto tambin se considera cambio de tipo ...

} Pero no puede haber junto a estos: public Peon(String butifarra, int edad){ //Tiene mismo tipo y cantidad de argumentos ... } A veces, jugando con esto se puede hasta ejecutar varios constructores cuando se crea un objeto; se hace as: public Peon(String color, int casilla){ this(color, casilla, 30); } public Peon(String color, int casilla, int altura){ ... } Aqu, si desde el main creamos un objeto Peon usando solo dos parmetros, se ejecutar el primero de estos dos constructores. Al ejecutarse el constructor, este coge y llama al mtodo this, con esos tres parmetros. Qu es el mtodo this? Antes, hemos usado la palabra this seguida de un punto y del nombre de una variable, para referirnos a esa variable del objeto. Y es que this, representa a este objeto. Por tanto, el mtodo this(), lo que ejecuta es el mtodo con el mismo nombre que el objeto, el constructor. Entonces en este ejemplo, el primer constructor lo que hace es llamar al segundo constructor con esos parmetros. IMPORTANTE: para que esto funcione, el this() tiene que ser la primera lnea de cdigo del constructor del que lo llamas. Si pones antes algn otro comando (los comentarios no cuentan), no funciona. Por ejemplo, esto no funciona: public Peon(String color, int casilla){ int n = 3; this(color, casilla, 30); } public Peon(String color, int casilla, int altura){ ... }

Atributos
Llamamos atributos a las variables definidas dentro de toda la clase/objeto. Se suelen escribir

lo primero de todo, justo despus de la primera llave {. Como atributos se suelen poner, desde las cosas que caracterizan al objeto (como en un pen el color o la casilla, como ya hemos visto), hasta cualquier cosa que sea interesante que el objeto guarde (por ejemplo, la clase tablero podra guardar tambin un array con el historial de todas las jugadas de la partida, el cual podra ser un atributo). Lo que no se suele poner, es variables que vayamos a utilizar solo dentro de algn mtodo, y que no nos sirva conservarlas para nada. Por ejemplo, un alfil, para su mtodo mover, necesitar hacer muchos clculos para saber a qu casillas puede ir y tal, y para ello, seguramente necesite guardar alguna variable durante los clculos. Sin embargo, una vez hechos los clculos, no queremos ms variables, luego no nos interesa tenerlas siempre guardadas (ocupan memoria); por ello, en vez de definirlas como atributos, las definimos dentro del mtodo que vayamos a necesitarlas. Al inicializar un objeto, se ejecuta el constructor, que suele inicializar varios de los atributos del objeto. Sin embargo, es normal que no se le mande inicializar todos, porque puede que haya alguno, como por ejemplo, el historial de la partida de ajedrez, que al principio no es necesario inicializarlo con nada. En estos casos, estas variables olvidadas se autoinicializan solas siguiendo las siguientes reglas: 0 para enteros, flotantes y caracteres false para booleanos null para objetos (null es equivalente a decir que el objeto est vaco). Con estos objetos me refiero a objetos que sean atributos de otros objetos, que puede hacerse perfectamente (por ejemplo, las String son objetos, y hemos estado usando el String color como atributo todo el rato). Se inicializan en el orden en el que aparecen declaradas en la clase

Sin embargo, no pasa lo mismo cuando declaramos una variable dentro de un mtodo y no la inicializamos. Esta no se autoinitializa, solo se autoinicializan los atributos del objeto y cuando lo creamos.

Vale, ahora bien, estos atributos (que recordar, se llaman as solo por formar parte de toda la clase, pero son variables como otra cualquiera), pueden ser de dos tipos:

De instancia (objeto):
Normales, como hasta ahora los hemos visto. En el caso del pen, las variables color y casilla son de este tipo. Cada objeto Peon creado, tendr su propio color y nmero de casilla, como debe ser, y si cambiamos el color de uno, no afecta a los dems. Si queremos acceder a un atributo de estos, puede hacerse de tres maneras: Con el nombre de la variable y ya est: si la usamos desde dentro del mismo objeto, en algn mtodo del objeto o algo, y no hay confusin con otras variables, como

argumentos del mtodo, que se llamen igual. Con el this.nombreVariable: se puede usar en los mismo casos que el apartado anterior, y adems tambin cuando hay confusin con otras variables, para diferenciar las de la clase de las del mtodo. Con nombreObjeto.nombreVariable: cuando queremos acceder a una variable de una objeto desde un mtodo que est fuera de ese objeto, por ejemplo, desde el main. IMPORTANTE: se escribira el nombre del objeto, es decir, peonb5, por ejemplo, y no Peon, porque estamos accediendo a una variable del pen blanco 5 en concreto, y no de los peones en general.

De clase:
Estos son las raros. Llevan delante del tipo de variable la palabra static. Para empezar, olvidarse de intentar entenderlo por su nombre, no quiere decir que nada sea esttico o no se mueva, para eso se usa la palabra final. static, a grandes rasgos, lo que hace es que las variables definidas as sean compartidos por todos los objetos de una misma clase. Por ejemplo, si en la clase Peon, declaramos el color como una variable static (solo poniendo la palabra static delante del tipo)... public class Peon{ static String color; int casilla; public Peon(String colorPeon, int casillaPeon){ color = colorPeon; casilla = casillaPeon; } } ...ahora todos los peones tendrn el mismo color. Entonces, si en el main cogemos y hacemos: public class PartidaAjedrez{ public static void main(String args[]){ Peon peonb5 = new Peon(Blanco, 37); Peon peonb6 = new Peon(Negro, 37); } } Cul ser el color de peonb6? Negro. Hasta ah todo normal. Pero, cul ser el color de peonb5? Pues negro tambin, porque, aunque al crearlo lo hicisemos blanco, luego cogemos, creamos el siguiente pen, y este pen mete en la variable color el negro. Y al ser color una

variable static, es compartida por todos los peones, y por tanto cambia para todos. Para acceder a atributos static, podemos hacerlo exactamente igual que con los atributos normales, de objeto, y adems tambin, estemos donde estemos, escribiendo: nombreClase.nombreVariable. IMPORTANTE: no confundirse escribiendo el nombre del objeto, es decir, la gracia de esto es poder escribir Peon.color, y no peonb5.color (aunque este, al ser uno de los tres casos con los que podemos acceder a las variables normales, tambin es posible y no da error).

Mtodos
Dentro de una clase hay dos tipos de mtodos (aparte de luego ya que cada mtodo pueda ser de todos los otros tipos como hemos visto en el tema 5 creo). Los tipos a los que me refiero son los mismos que con atributos:

De instancia (objeto):
Son los mtodos tpicos. No hay que ponerles nada extrao al definirlo, a parte de lo de public/ private void/int/char... nombreMetodo(). Pueden utilizar tanto las variables definidas dentro del mtodo (como los parmetros), como cualquier atributo del objeto o la clase. Para llamar a estos mtodos, se puede hacer desde dentro del objeto, simplemente escribiendo nombreMetodo(), o desde fuera del objeto, por ejemplo desde el main, escribiendo nombreObjeto.nombreMetodo(). Como siempre, no confundir nombreObjeto con nombreClase.

De clase:
Igual que pasaba con los atributos, llevan la palabra static, pero ahora en medio: public/private static void/int/char... nombreMetodo(). Estos mtodos tienen dos diferencias con los de instancia: Desde un mtodo de clase no se puede hacer referencia a variables/mtodos de objeto (que no sean static) ni a this, porque el mtodo no se invoca sobre un objeto determinado sino sobre la clase entera. Para llamar a un mtodo de clase, podemos, o bien hacerlo como a los mtodos anteriores, o tambin desde fuera del objeto, escribiendo nombreClase.nombreMetodo()

Pasar por parmetros:


Cuando pasamos parmetros a un mtodo, aunque antes no nos fijbamos en ello, ahora que

conocemos los objetos, podemos ver que hay dos maneras distintas de hacerlo, segn sea el tipo de los parmetros que pasamos: Paso por valor: se da si pasamos cualquier tipo primitivo (byte, int, float, double, char, boolean pero no arrays). Lo caracterstico de esto es que el parmetro se copia al ser llamado el mtodo, y cualquier modificacin que se le haga dentro del mtodo no afectar a la variable original. Por ejemplo: public static void main(String[] args) { int n=2; modifica(n); System.out.println(numDespues=+n); } public static void modifica(int n){ n=n+2; System.out.println(numEnMetodo=+n); } Este programa imprime numEnMetodo=4, y numDespues=2 ya que la n exterior al mtodo no se ha modificado.

Paso por referencia: se da cuando pasamos cualquier otro tipo de parmetro a un


mtodo. Es decir, que conozcamos, arrays y objetos. La diferencia con el paso por valor, es que ahora no se copia el parmetro en el mtodo, sino que se pasa el original. Por ello, si cambiamos algo del objeto dentro del mtodo, esto cambia para siempre. Ejemplo: public static void main(String[] args) { Peon peon5b = new Peon("blanco", 37); modifica(peon5b); System.out.println(colorFuera=+peon5b.color); } public static void modifica(Peon p){ p.color = "negro"; } Este programa imprime que el colorFuera=negro, ya que ahora el cambio que hemos hecho en el mtodo s modifica el objeto.

Si queremos que un tipo primitivo (por ej, un double) se pase por referencia a un mtodo, lo que podemos hacer es crear una clase y ponerle como atributo ese double. Luego creamos un objeto a partir de esa clase, lo inicializamos con el valor del double que queremos guardar, y ahora lo que pasamos al mtodo, en vez del double directamente, es el objeto que lo contiene. De esta manera, como es un objeto, se pasa por referencia, y se conservan los cambios.

Destructor
Igual que el constructor, que es un mtodo que se ejecuta al inicializarse un objeto, existe tambin otro mtodo llamado destructor, que se ejecuta cuando se borra un objeto de la memoria. Es el mtodo finalize. No se ve nada en profundidad, as que ms no puedo decir...

Leer adems...
Leer tambin del Tema 6 la pgina 2 diapositiva 2 para posibles preguntes trampa de teora, y leer lo de packages, import y demas de las ultimas diapos.

You might also like