![]() |
Pràctica 2: Un Objecte de Java per dins ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
L'objectiu d'aquesta pràctica és l'estudi d'una classe de Java a partir de l'anàlisi detallada del seu codi font. Aprendràs a identificar, entendre i escriure una classe senzilla de Java amb els seus camps, constructors i mètodes. |
|||
Les peces d'un objecte de Java | |||
Fes un nou cop d'ull al programa perquè ara l'hauràs d'analitzar ben a fons. Has de tenir en compte en aquesta lectura que les línies que comencen amb * o amb // no són estrictament codi del programa sinó aclariments per fer-lo més entenedor quan el llegiu les persones que l'estudieu; més avall ja s'explica amb detall. |
|||
![]() |
/** /** /** |
||
La definició d'una classe
|
|||
El mínim que necessites per a que una classe de Java funcioni
és un nom. Per a posar nom i crear classes has
de seguir la sintaxi següent : |
|||
public
class Mobil { aquí el contingut de la classe } |
|||
Dins la classe has d'escriure els tres components essencials d'una classe de Java: els camps, els constructors i els mètodes:
|
|||
![]() |
Java és molt flexible pel que fa a l'ordre en què estan escrits els camps, els constructors i els mètodes d'una classe. No és un error de sintaxi posar, per exemple, primer els mètodes que els constructors. Tot i així, els programadors mantenen convencions:
D'aquesta forma, quan passis la teva classe a un altre programador, la
podrà llegir amb facilitat. |
||
Els camps (o variables d'instància) | |||
Qualsevol objecte necessita valors per a funcionar. Els nostres mòbils necessiten disposar d'un preu de la trucada i un saldo per a gestionar la nostra despesa telefònica. Observa aquest fragment de la classe Mobil : |
|||
public class Mobil { Aquí la resta del contingut
de la classe |
|||
El camp numero desa el número del nostre telèfon. Observa que escrivim private int numero i immediatament després fem l'assignació de valor (= 630010203). Més endavant estudiaràs perquè fem privats els camps de les classes. Com que el número de telèfon és sempre un número enter, el definim del tipus int, enter. Si tingués decimals el podríem definir del tipus float o del tipus double. Si fos una cadena de text, el definiríem com a String. Poc a poc aniràs descobrint la quantitat immensa de tipus que pot arribar a tenir Java. Els dos camps següents saldo
i preu contenen respectivament el saldo de la
targeta i el preu de cada pas de trucada. Els definim també del
tipus int. Observa que en aquest cas només
els creem i no n'assignem cap valor. Si no ho fem nosaltres, Java els
donarà un valor per defecte, el 0. |
|||
![]() |
|
||
Ara volem afegir al mòbil la capacitat de comptar el número total de trucades que hem fet des que l'hem creat. | |||
![]() |
|
||
public class Mobil { ... private int preu; private int trucades; ... } |
|||
|
|||
Ara torna a obrir l'editor de la classe Mobil
i observa el text escrit sobre cadascuna de les definicions de camp: es
tracta de comentaris, que serveixen per a fer aclaridor
el contingut dels programes a una lector humà tot i que no tenen
cap efecte en el propi programa: |
|||
|
|||
![]() |
Per a comentar una línia o una part de línia utilitzareu el símbol //.
|
||
Per acabar aquesta secció, feu un comentari d'una línia (//) explicant per a que serveix el camp trucades. |
|||
Els constructors | |||
T'has fixat en què cada vegada que creem un objecte o instància de la classe mobil el saldo inicial és de 350 unitats monetàries? O que el preu de cada pas és de 2 unitats? Aquesta informació que un objecte sap des que el creem, la hi passem a través dels constructors.
Observa aquest fragment de codi de la classe mòbil: |
|||
public class Mobil() { public Mobil() { |
|||
El fragment que hem deixat és un constructor
de la classe Mobil. Fixa't bé a veure si
descobreixes què té d'especial la sintaxi d'un constructor:
Si observes el codi que hi ha a l'interior del constructor veuràs la manera com assignem valor als camps saldo i preu. Una classe pot tenir més d'un constructor. Imagina que necessitem crear dos tipus de telèfons: uns que es creen per defecte amb les 350 unitats monetàries i d'altres en què s'ha de decidir en el moment de l'activació quin és el seu saldo inicial. Per a atendre aquest segon cas, podem crear un constructor especial. Fem-ho. |
|||
![]() |
Obre el |
||
public Mobil(int saldoInicial) { saldo = saldoInicial; preu = 2; } |
|||
Abans de continuar, intenta trobar la diferència amb el constructor original: continuem sense posar nom ni tipus, però hem afegit entre els parèntesis del constructor un paràmetre, un enter que es diu saldoInicial. Aquest terme és nou i molt important a la programació: paràmetre. Te l'expliquem en la següent pràctica, ara mira l'aspecte que té i el que fa.
|
|||
![]() |
|||
Figura 1. Creació d'un objecte de la classe mobil
amb el segon constructor.
|
|||
|
|||
Els mètodes | |||
Analitza aquest codi: |
|||
public
class Mobil() { aquí els camps aquí els constructors public void carrega(int quantitat) public void truca(int passos) public int getNumero() public int getSaldo() public void setPreu(int preu) public int getPreu() public void printSaldo() } |
|||
Si has estat trastejant amb objectes d'aquesta classe ja saps el que fa cadascun d'ells. Ens interessa que et fixis en les diferències i similituds que hi ha en la seva sintaxi:
|
|||
Les parts d'un mètode | |||
Els mètodes tenen capçalera i cos, com els constructors o les classes. En la capçalera hi posem el nom del mètode, el tipus d'informació que retorna el tipus d'informació que li hem d'entrar per a poder funcionar. En el cos del mètode es codifica la feina del mètode. Això és una capçalera: |
|||
public void carrega(int quantitat) |
|||
i això és el cos del
mètode carrega: |
|||
{ saldo+=quantitat; } |
|||
L' operador -= té un funcionament similar
però amb la resta, en lloc de la suma. |
|||
El significat de la capçalera: mètodes void o amb tipus | |||
Ara imagina't un mètode com si fos una caixa fosca que no ens deixa veure el que hi ha al seu interior o com si fos una peça del teu ordinador, que la saps muntar, saps quina feina fa, però no saps com funciona internament. Només veus la capçalera. En moltes ocasions, només sabràs d'un mètode la informació que et dóna la seva capçalera. Per això has d'aprende a llegir-la correctament. |
|||
El mètode retorna valors? Aquesta és la primera qüestió que has d'aprendre a contestar per a un mètode de Java: ens retorna un valor o només fa una feina interna a la classe? Això és molt fàcil de llegir en una capçalera: els mètodes que per se no retornen cap valor porten l'atribut void.
|
|||
A) Mètodes amb tipus | |||
Habitualment voldrem que alguns mètodes serveixin per contestar-nos i passar-nos informació d'algun tipus o altre relatiu al valor actual d'alguna característica de la instància o objecte que estem analitzant. Quan a la capçalera d'un mètode trobes un tipus de dada (int, String, boolean) i no la partícula void això vol dir que el mètode ens retorna informació. Revisa aquest mètode: |
|||
public int getSaldo() { return saldo; } |
|||
Recordeu què fa? Ens diu quin és el saldo que ens resta al mòbil. Crideu-lo des del ![]() |
|||
![]() |
|||
Figura 2. Un mètode amb tipus ens respon un nombre
enter (int)
|
|||
La finestra que s'ha obert et retorna un número enter (int) amb el valor del teu saldo. Fixa't que a la capçalera del mètode tenim definit el mètode com a int a diferència dels mètodes amb void que comentarem més avall.
|
|||
Endevines el significat de la paraula reservada return en el cos del mètode? És tracta del valor de retorn del mètode. En els mètodes que retornen algun valor, hem de posar obligatòriament un return. En canvi en els mètodes void, veurem que no hi apareix return perquè no retornen automàticament cap valor; en cas de voler fer sortir informació com un text en pantalla o d'alguna altra manera haurem de fer servir les sentències adequades en els mètodes void. | |||
![]() |
|
||
B) Mètodes void | |||
A diferència dels anteriors, sempre que et trobis amb un void a la capçalera d'un mètode has de pensar que el mètode treballarà però que el seu objectiu no és donar-te el valor d'un camp o variable simplement pel fet de cridar-lo. Revisa aquest mètode: |
|||
public void truca(int passos) { saldo-=(passos*preu); } |
|||
Recordes el què fa? Ens descompta del saldo del mòbil
una quantitat de diners perquè hem estat fent una trucada. Crida'l
des del |
|||
Tanmateix, veuràs en pràctiques següents que en els mètodes void s'hi poden incloure sentències que fabriquen altres tipus de sortides o respostes per a l'usuari o usuària del programa com és ara missatges, indicacions, resultats complexos,... que podem fer que s'imprimeixin en una finestra auxiliar | |||
Una proposta final | |||
Naturalment, rpimer de tot haurem de fer una feina que encara no havíem incorporat al codi de la classe Mobil. Has de modificar el mètode truca perquè s'incrementi en una unitat el camp trucades cada cop que utilitzem el telèfon. És a dir, que per cada trucada que simulis has de fer trucades = trucades + 1 o si t'estimes més abreujar, trucades++. I ara, imagines com ha de ser la capçalera del mètode que t'havíem proposat? Retorna algun valor o no? Necessita algun paràmetre per a funcionar? És un mètode molt senzill, té aquest aspecte: |
|||
public int getTrucades() { return trucades; } |
|||
![]() |
Obre l'editor de codi la classe i afegeix aquest mètode (vigila no posar-lo per error en el cos d'un altre mètode!). Enregistra els canvis amb l'opció de menú Classe|Desar o amb Ctrl-S i després recorda't de compilar. Tot seguit crea un objecte nou de la classe i executa el mètode
getTrucades(). Has d'obtenir, de moment, el
resultat següent: |
||
![]() |
|||
Figura 3. Valor inicial de retorn del mètode
getTrucades().
|
|||
Ara fes algunes trucades amb el mètode truca i després torna a executar getTrucades(). Ha funcionat? |