You are on page 1of 48

MDUL 2: JAVA COM A LLENGUATGE DE PROGRAMACI ORIENTAT A LOBJECTE

Introducci Tipus primitius i objectes Com es duu a terme la declaraci de variables? Com accedir als mtodes? Lassignaci Operacions de comparaci i cpia Pas de parmetres Classes Definici amb mtodes Estructura duna classe Resum Sobrecrrega de mtodes Utilitzaci de this Atributs esttics Mtodes esttics Relacions entre classes(I) Associaci Agregaci s Exemple Complert Disseny de classes Relacions entre classes(II) Herncia simple Utilitzaci de super Loperador instanceOf Redefinici de mtodes Visibilitat datributs i mtodes Modificador abstract Modificador final Manual de UML Bibliografia recomanada Glossari Figures

89

Introducci
Lelement fonamental de la programaci orientada a lobjecte s lOBJECTE. Un Objecte es pot definir com una agrupaci o collecci de dades i operacions que tenen una estructura determinada i mitjanant la qual es poden modelar aspectes rellevants dun problema. El objectes que comparteixen un cert comportament es poden agrupar en diferents categories anomenades CLASSES. Una classe, per tant, s una descripci de quin s el comportament de cadascun dels objectes de la classe. Es diu llavors que lobjecte s una instncia de la classe. El llenguatge Java s un llenguatge orientat a lobjecte, per la qual cosa es pot dir que programar en Java consisteix a escriure les definicions de les classes i utilitzar aquestes classes per a crear objectes de manera que representin el problema a resoldre adequadament. El llenguatge Java cont un gran nombre de classes, objectes i mtodes predefinits (com hem vist al (mdul Java com a llenguatge de programaci estructurada amb la classe String), per la qual cosa no s necessari reinventar-los, noms cal utilitzar-los quan es necessiten. Posant un exemple planer, imaginem que volem guardar els cotxes amb les seves caracterstiques i funcionalitats. Crearem una CLASSE cotxe, amb unes dades a guardar com el color, la velocitat,... aix serien els ATRIBUTS O VARIABLES DINSTNCIA i unes funcionalitats (arrancar, canvi_oli,etc.) que sanomenen MTODES. Un OBJECTE (o instncia de la classe) en concret seria per exemple el cotxe ferrari, que t uns valors pels atributs definits anteriorment (color vermell, 280km/hora,....) .

Tipus primitius i objectes


En el mdul Java com a llenguatge de programaci estructurada hem utilitzat els tipus primitius del llenguatge Java (numrics, carcter i lgic) juntament amb altres tipus que representaven magatzems dinformaci, com les cadenes de carcters, els vectors i els arrays. En Java, tots els tipus que no siguin cap dels primitius (int, long, double, short, char, boolean i byte) sn tipus de referncia. Una variable de referncia en Java s una variable que guarda, entre daltres coses, una referencia a una adrea de memria on semmagatzema un objecte. Aix doncs, mentre que una variable que representa un tipus primitiu emmagatzema el valor daquest tipus, una variable que representa un tipus de referncia noms emmagatzema una referncia a la localitzaci en memria daquest objecte. Les referncies de memria sn assignades automticament pel compilador i no poden ser accessibles per lusuari. Per aquest motiu no es poden utilitzar operacins de manipulaci de referncies com en el llenguatge de programaci C. Si per algun motiu es necessita tenir referencies dels tipus primitius int o double, el mateix llenguatge defineix les classes Integer i Double. Com en altres llenguatges de programaci, si dues variables de referncia tenen un mateix valor, llavors les dues estan referenciant al mateix objecte. A ms, quan una referncia no apunta a cap objecte, llavors emmagatzema la referncia nula o null. La constant null s nica i sutilitza per a qualsevol objecte (es diu que est sobrecarregada). Com es duu a terme la declaraci de variables? En el mdul anterior ja hem vist com dur a terme la declaraci de variables que emmagatzemen tipus primitius. En la declaraci dobjectes, la declaraci de lobjecte no genera aquest mateix objecte. Per exemple,

90

Suposem que volem crear un objecte de tipus Panell (La classe Panel serveix en Java per dur a terme la gesti dinterfcies) Panel p; // p val null p = new Panel(); // p referencia a lobjecte creat La creaci no cal fer-la en dos passos. Es pot fer directament: Panel p = new Panel(); Per tant, quan es vol utilitzar un objecte dun cert tipus (en lexemple de tipus Panel) cal crear-lo explcitament. Fins que no shagi creat lobjecte no existeix i qualsevol intent de referenciar-lo abans de la seva creaci (p = new Panel()) provocaria un error en temps dexecuci. NOTA: Les variables locals dels mtodes shan dinicialitzar abans de fer servir. Les variables dinstncia de tipus bsic sinicialitzen per defecte. Com accedir als mtodes (de les classes i objectes)? Associats als objectes poden existir-hi mtodes que saplicaran sobre aquests. Loperador punt (.) s lencarregat de permetre seleccionar els mtodes que aquest objecte cont. En notaci dobjectes, quan sexecuta un mtode associat a un objecte, es diu que senvia un missatge a lobjecte en qesti. Per exemple si agafem una classe predeterminada en Java, com s la classe de lexemple anterior (Panel) i la classe Button (permet crear dins dun Panel els tpics botons dAcceptar i Cancelar) ... Panel p=new Panel(); // Creaci del panell. Button b=new Button(); // Creaci del bot b.setLabel(Acceptar); // Crida al mtode setLabel de la classe Button, //que permet crear un bot amb el nom que se li //entra com a parmetre p.add(b); // Safegeix el bot al panell utilitzant el //mtode add de la classe Panel que permet afegir //al panell el que se li entra com a parmetre. ... Nota: Les classes Panel i Button estan dins del paquet java.awt Si un objecte no existeix (perqu t el valor null) i se li prova denviar un missatge es generar la excepci NullPointerException. Tamb cal remarcar que molts objectes poden crear-se donant-los directament un valor inicial. Per exemple en el cas dels botons podrem haver fet directament: ... Button b = new Button(Acceptar); ... Lassignaci Donades dues varaibles de tipus compatibles (tant si sn tipus primitius com variables de referncia) si fem lassignaci = entre elles, es substitueix el valor duna pel de laltra.

91

Per exemple: t1 = t2 // Es substitueix el contingut de la variable t1 pel de t2 Per tant, cal tenir cura de no perdre referncies a objectes que desprs es puguin necessitar. Per exemple: ... Button un = new Button(Acceptar); Button dos = new Button(Cancelar); dos = un; // cpia de referncies. dos referencia a on referenciava un ... En aquest exemple sha perdut la referncia de lobjecte dos perqu ambds referencien al mateix objecte. Operacions de comparaci i cpia Tot objecte t les operacions de comparaci (equals) i de cpia (clone). En el cas dels tipus primitius existeix la operaci == que permet saber si els valors de les variables que es comparen sn iguals o no. En els cas dels objectes, si utilitzem loperador == ens retornar cert o fals depenent si sn iguals les referncies dels dos objectes. Per tal de poder comparar correctament els continguts dels objectes cal utilitzar el mtode equals. Per exemple, si creem dos objectes qualssevol podrem comparar-los amb el mtode equals: ... Objecte un = new Objecte(); Objecte dos = new Objecte(); if un.equals(dos) then System.out.println(Son iguals) else System.out.println(Son diferents); ... En el cas de la cpia dobjectes succeeix el mateix i per tant, per tal de poder fer-ne una cpia cal utilitzar el mtode clone: ... Objecte un = new Objecte(); Objecte dos = un.clone(); ... Per tant: Una assignaci entre referncies copia l'adrea continguda. L'operador == compara si dues referncies referencien un mateix objecte, per no el contingut d'aquests objectes. Per aix sutilitza el mtode equals() L'operador = assigna referncies. Si cal copiar objectes, podem usar el mtode clone(). Pas de parmetres En Java, el pas de parmetres s sempre per valor. Aix vol dir que quan el parmetre de cert mtode s un objecte representat mitjanant una referncia, el valor que es transmet al mtode s la referncia a la zona de memria on es troba lobjecte.

92

Proveu qu succeeix quan executeu els segents exemples: Exemple 1: p.java Exemple 2: p1.java Exemple 3: p2.java

93

CLASSES
Lelement bsic de la Programaci Orientada a lobjecte en Java s la classe. Una classe s una descripci de lestructura i el comportament dels objectes que pertanyen a la classe. Suposem que necessitem representar els triangles rectangles i de cadascun ens interessa saber la base i lalada. A ms, de cadascun dels triangles ens interessen una srie doperacions. Podrem definir una nova classe, anomenada triangle, molt simple: class triangle{ double base; double alada; }// fi de la classe En aquesta definici sha incls el nom de la classe (triangle) i el nom de dos variables (base i alada) associades a cada nou objecte de la classe triangle que es vulgui crear. Aquestes variables, que representen informaci prpia de cada objecte, sanomenen atributs o tamb variables dinstncia. En general, una nova classe es guarda en un fitxer (amb el nom que t la classe) i que al compilarse genera un fitxer .class. Fet aix, s possible utilitzar la nova classe. Aix, en el segent programa es realitzen una srie doperacions amb la nova classe que sacaba de definir: provaTriangle.java Mitjanant loperador new es crea el nou objecte, mentre que la referenciaci de cadascuna de les variables dinstncia de lobjecte es realitza amb loperador punt. Encara que, com sha dit anteriorment, la classe triangle es pot escriure en un fitxer individual, tamb s possible escriure-la en un mateix fitxer amb altres classes (per exemple amb la classe provaTriangle). Amb aix, quan compilem aquest fitxer es generaran tants fitxers .class com diferents classes hi hagi. Ull! Noms pot haver-hi una classe amb un mtode main en un mateix fitxer Java. En lexemple anterior, per mitj de la instrucci (t1.base*t1.alada)/2 es calcula lrea del triangle. Encara que s possible fer-ho daquesta manera, aquesta no s la manera ms adequada. Penseu que caldria repetir una instrucci com lanterior tantes vegades com triangles diferents hagussim creat. La soluci a aquest problema consisteix en la realitzaci dun mtode que encapsuli la operaci. No obstant, aquesta tampoc seria la soluci millor, ja que qualsevol classe que utilitzi la classe triangle no t perqu conixer com es representa internament un triangle, de la mateixa manera que per sumar dos valors double s irrellevant la representaci concreta que utilitza el compilador per emmagatzemar un valor double. Des del punt de vista de la programaci orientada a lobjecte, una nou objecte queda definit per: Una estructura de dades que la suporti Un estat, o valor de lobjecte en cada instant Un conjunt de mtodes per manipular-lo

94

Aix, en lexemple del triangle, els atributs base i alada sn lestructura de lobjecte, sent el valor de lobjecte en cada instant el valor de les components base i alada.

Definici amb mtodes


A continuaci es mostren diversos aspectes que fan referncia a laccessibilitat de la informaci declarada en una classe. Considerem per exemple, la segent definici per la classe triangle: class triangle{ private double base; private double alada; public triangle(){ } public double area(){ return(base*alada/2) } public double getbase(){ return(base); } public double getalada(){ return(alada); } public void setbase(double bas){ base=bas; } public void setalada(double al){ alada=al; }

Segons sha definit anteriorment: Tota la informaci declarada com a private s exclusiva de lobjecte i inaccessible des de fora de la classe. Aix, qualsevol intent daccs a les variables dinstncia base i alada que es realitzi fora de la classe donar lloc a un error de compilaci. Tota la informaci declarada public s accessible des de fora de la classe. Aix, en altres classes es podr accedir a qualsevol dels mtodes aix definits. En quant als difererents mtodes que apareixen cal remarcar que en qualsevol mtode existeix per defecte ( i per tant, pot o no declarar-se) un mtode sense tipus amb el nom de la mateixa classe. En lexemple s el mtode triangle(). Aquest mtode s el que sutilitza per tal de crear un nou objecte de la classe per mitj de loperador new. Els mtodes es poden classificar, atenent a la seva funci en: Constructors: Sn mtodes que permeten la construcci de lobjecte. En lexemple anterior lnic constructor s el mtode triangle(). Com veurem ms endavant pot tenir arguments i inicialitzar lobjecte duna certa manera. Accessors o getters: Sn mtodes que permeten conixer, sense alterar, lestat de lobjecte. Per convenci sanomenen mtodes getters, ja que es nomenen amb el prefix get seguit del nom de latribut que permeten retornar.

95

Modificadors o setters: Sn mtodes que permeten alterar lestat (valors de les variables dinstncia) de lobjecte. Per convenci sanomenen mtodes setters, ja que es nomenen amb el prefix set seguit del nom de latribut que permeten retornar. Per tal de poder executar un mtode corresponent a un objecte (enviar-li un missatge), cal utilitzar la notaci de punt. Per exemple, es segent programa fa s de la nova classe triangle definida: provaTriangle2.java

Estructura duna classe


Ara que ja hem vist un exemple de realitzaci duna classe, podem donar la definici o forma general duna classe: [qualificadors] class nombre_clase [ extends nombre_clase ] { [qualificadors] tipus nomVar1; // Definici dels atributs o variables dinstncia [qualificadors] tipus nomVar2; ... ... ... [qualificadors] tipus nomVarN; [qualificadors] tipus nomMtode1 ([listaargs]) { // Definici dels mtodes cos_del_mtode } [qualificadors] tipus nomMtode2 ([listaargs]) { cos_del_mtode } ... ... ... [qualificadors] tipus nomMtodo-n ([listaargs]) { cos_del_mtode } } on tots els elements que apareixen entre [ i ] en la declaraic sn opcionals. Aix mateix, el terme tipus fa referncia a un nom de tipus, tant primitiu com una altre classe, que en el cas dels mtodes pot ser void o b el tipus de lelement de retorn. Cadascun dels nomVar i cadascun dels nomMtode fan referncia a una variable dinstncia o a un mtode. Els nics qualificadors estudiats fins ara sn els corresponents a lmbit de la declaraci (private i pblic) encara que poden ser daltres tipus com protected o static, que es descriuen ms endavant. A ms, un o ms mtodes poden ser constructors de la classe, amb la qual cosa no tindrien tipus especfic. Recordem, doncs, que: Un Objecte s una unitat de programaci que associa dades amb les operacions que poden utilitzar/afectar aquestes dades. Les operacions les anomenarem mtodes i les dades atributs o variables dinstncia. Amb els objectes es pretn tamb, amagar la implementaci concreta de les dades i les operacions: encapsulament.

96

Els objectes responen a missatges: destinatari.missatge el destinatari s un objecte (o expr. obj) quan rep el missatge en temps dexececuci se selecciona el mtode corresponent Els objectes com a entitats poden canviar destat, comportar-se de diferents maneres i ser manipulats per diferents estmuls. Un Objecte existeix (espai), te atributs i diferents funcionalitats Un mtode s una secci delimitada de codi que pertany a una classe i que defineix un comportament especfic d'aquesta classe. De fet, els serveis o mtodes sn les operacions que es poden fer sobre les dades. Poden ser funcions o procediments, s a dir, poden retornar valors de qualsevol tipus o no retornar cap valor. Un missatge s el mecanisme pel qual s'invoca a un mtode. Un missatge consisteix en el nom del mtode seguit d'una llista_parmetres que pot ser buida. El protototipus seria la capalera del mtode, s a dir el nom del mtode junt amb la descripci de la llista de parmetres i el tipus de retorn. El tipus de valor void indica que el mtode no retorna cap valor. Les funcions retornen el seu valor grcies a la paraula reservada return. Tota classe t associat un servei que serveix per a crear objectes. Aquest servei es coneix amb el nom de constructor. De fet els constructors sn els mtodes de la classe que permeten crear o instanciar objectes. Per exemple, UnAlumne s una instanciaci de la classe Alumne, i el creem grcies a la crida al mtode new Alumne() que de fet s el constructor de la classe. En Java s'utilitza la paraula clau new per tal de sollicitar la creaci d'un objecte . Aquest constructor retorna una referncia a l'objecte que ha creat. L'operador new ens dna una referncia a un objecte per a poder-lo utilitzar posteriorment, per no serem capaos d'enviar missatges a l'objecte creat a menys que guardem aquesta referncia. Per aquest motiu cal crear una variable del tipus la classe que estem creant per tal de poder guardar el nou objecte creat. El nom d'un mtode constructor s sempre el mateix que el nom de la classe a la que pertany.

Sobrecrrega de mtodes
Prenent com a base el darrer exemple on sha definit la classe triangle, hi apareix un constructor triangle() que el que fa s nicament crear lobjecte (per aix no est definit el cos del constructor), i dos mtodes setBase i setAlada per assignar valors a les variables dinstncia dels objectes. s possible definir un mtode constructor que a ms a ms de crear lobjecte, alteri el seu estat, per exemple per inicialitzar els valors de les variables dinstncia. class triangle{ private double base; private double alada; public triangle(){ } // primer constructor segon constructor

public triangle(double bas, double al) { // base=bas;

97

alada=al; // tercer constructor

public triangle(double mesura){ base=mesura; alada=mesura; } public double area(){ return(base*alada/2) } public double getbase(){ return(base); } public double getalada(){ return(alada); } public void setbase(double bas){ base=bas; } public void setalada(double al){ alada=al; }

En aquest exemple ara hi ha tres mtodes constructors, que sanomenen igual per tenen diferent nombre de parmetres. Aix podrem tenir: mesProva.java Un altre exemple: sumar.java De fet, laplicaci ms habitual de la sobrecrrega de mtodes s la sobrecrrega de constructors.

rectangle2.java

En els llenguatges de programaci sanomena sobrecrrega a la definici dun mateix tem (smbol, identificador, etc.) amb diferentes significats, de manera que en funci de la manera que sutilitzi pot interpretar-se el seu significat. Un altre exemple de sobrecrrega s loperardor +, que sutilitza com a operador de concatenaci de cadenes i com a operador de suma aritmtica. La sobrecrrega explcita dels mtodes t una gran importncia en la programaci orientada a lobjecte, especialment a la seva utilitzaci en la relaci dherncia entre classes, com veurem ms endavant. No obstant, s prcticament inexistent en altres llenguatges de programaci tradicionals com C o Pascal. Java permet que varis mtodes dins duna classe es diguin igual, sempre i quant la seva llista de parmetres sigui diferent. Aix es coneix amb el nom de sobrecrrega de mtodes. Per tant, en

98

la sobrecrrega de mtodes, es diferencia quin mtode sexecutar pel tipus dels parmetres o b, pel nombre de parmetres. La sobrecrrega permet al programador utilitzar el mateix nom per a dos mtodes diferents. El que invoca el mtode especifica implcitament quin dels mtodes ser invocat mitjanant la llista d'arguments que es passa en el missatge, i que llavors es compara amb els prototipus dels diferents mtodes candidats fins a trobar una coincidncia. La determinaci de quin s el mtode correcte es fa en temps de compilaci.

Utilitzaci de this
El llenguatge Java inclou una referncia especial anomenada this, que sutilitza dins de qualsevol mtode per tal de poder referenciar a lobjecte actual. El valor this es refereix a lobjecte sobre el qual sha cridat el mtode actual. Comprovem el segent exemple: triangle4.java En lexemple anterior la referncia this indica lobjecte en curs, permetent resoldre lambigetat relativa als noms dels parmetres. Un altre exemple ms interessant de ls del this s que no sempre s possible conixer sobre quin objecte sest treballant. Suposem un cas en que es t una classe Compte amb un mtode transferncia. Aquest mtode transfereix tot el diner dun compte, indicat per parmetre, al compte que representa lobjecte en curs. La classe compte i el mtode transferncia podrien ser implementats de la segent manera: compte.java Per qu succeeix si es realitza una transferncia quan el compte representat per lobjecte en curs i lorigen sn la mateixa? Mirem el segent exemple: provaCompte.java El resultat final s la eliminaci del compte dorigen i de dest, ja que ambds comptes sn, en realitat el mateix. Una possible soluci seria la segent:

provaCompte2.java
Aquest exemple funcionaria si lidentificador dels comptes s nic per cada compte, ja que aix es podira comprovar la igualtat dels identificadors corresponents als comptes. Veiem-ne ms exemples de ls de lidentificador this: prova.java Quan executeu, veureu que us retorna un 2. En aquest cas, el mtode successor no noms incrementa la propietat privada i, sino que tamb es retorna a si mateix, la qual cosa permet cridarlo vries vegades en la mateixa ordre.

99

Daltra banda, this tamb es pot utilitzar com a mtode, o ms aviat com a constructor. A vegades pot ser molt cmode, quan tenim diversos constructors amb diversos parmetres, permetre que es cridin entre ells. Per exemple: rectangle3.java El segon constructor, en lloc de modificar directament el valor de les variables, crida al constructor que admet quatre parmetres utilitzant this.

Atributs esttics
Els atributs esttics sutilitzen quan s necessari que una variable sigui accessible per tots els elemetns de la classe. Aquestes varaibles tamb sanomenen variables de classe i es declaren amb el modificador static. class exemple { int x; // x s una variable de instncia static int y; // y s global a todas las instncies } Quan es declara un nou objecte de tipus exemple, contindr una instncia particular de la variable x, mentre que la variable y es comporta com una variable global per a totes les instncies de la classe. Aquestes variables sutilitzen normalment per mantenir informaci relativa a tots els objectes de la classe, per exemple mantenir un comptador dinstncies creades. Per accedir a les variables de classe es fa amb la notaci de punt. Exemple: provaEx.java Comproveu que cada vegada que es crea un objecte sincremeta el comptador global associat a la classe. Una altra utilitat dels atributs esttics consisteix en la definici de constants simbliques, independentment dels objectes especfics que es construeixin. En aquest cas tamb sutilitza el modificador final, mitjanant la qual es defineix la no modificabilitat de lelement que la t. Ve a ser una constant accessible per totes les instncies de classes que es crein. Per exemple, en Java la classe predefinidia Integer cont la segent definici: public final static int MAX_VALUE = 2147483647; que pot escriures de la segent manera: System.out.println("Max Int: "+Integer.MAX_VALUE); Les variables de tipus static sn, en alguns aspectes, similars a les variables globals dalguns llenguatges. El llenguatge Java no t variables globals, per t variables static, a les que pot accedir des de qualsevol instncia duna classe.

Mtodes static

100

Igual que les variables de classe, els mtodes amb el modificador static sn propis de la classe, sense que sapliquin especficament sobre cap objecte de la classe. s a dir, poden ser utilitzats sense crear cap instncia de la classe. A aquests mtodes tamb sels anomena mtodes de classe. Per exemple sn mtodes static alguns predefinits pel llenguatge com la classe Math, on les funcions trigonomtriques i logartmiques sn de tipus static. Exemple: .... System.out.println(El mnim es +Math.min(2,3)); ... Un altre exemple: laFuncio.java us.java

Els mtodes esttics o amb responsabilitat de classe sn aquells mtodes que permeten realitzar un conjunt daccions i operacions (fer coses) que no necessiten duna instncia de la classe per tal de realitzar-les (no estan associats amb cap objecte en particular). Aquest tipus de mtodes es fan servir normalment, per realitzar accions comunes a totes les instncies. Aquests mtodes es defineixen de la mateixa manera que la resta de mtodes, excepte que porten la paraula clau static com a modificador del mtode (abans del tipus de retorn). Els mtodes static mai estan associats a un objecte de la classe. Aix: Els mtodes static es poden d'invocar de manera independent de qualsevol instncia de la classe; s'invoquen utilitzant el nom de la classe com a receptor del missatge. Els mtodes responsabilitat de classe no poden accedir a les variables d'instncia, ja que el receptor no s un objecte, i per tant, no tenen variables d'instncia. L'nica manera daccedir-hi s creant una instncia de la prpia classe, i accedir als atributs dinstncia del nou objecte. El mtode main() s esttic, perqu laplicaci ha daccedir a ell per executar-se, abans de que es realitzi cap instncia.

101

RELACIONS ENTRE CLASSES (I)


Agregaci, Associaci, s 1. Agregaci Tamb es diu "Relaci is-part-of", i normalment la trobem en un dels tres casos segents: Acoblaments - parts: una Mquina i les seves Peces, un Habitatge i cadascuna de les seves Habitacions. Continent - contingut: un Avi i la seva Tripulaci. A la prctica d'exemple trobem el Compte Bancari i les seves Transaccions. Colleccions - membres: un Departament i els seus membres. Un equip de Futbol i els seus jugadors. A la prctica "Gesti de sous" trobem la Empresa i els seus Treballadors, el Directiu i els seus Venedors Quasi sempre, quan tenim una relaci d'agregaci entre dues classes, una d'elles ha de tenir dins seu una llista d'objectes de l'altra classe. En lexemple de Disseny de classes hi ha una relaci dagregaci entre les classes Departamentassignatura i Departament-Alumne. 2. Associaci Tamb es diu "Relaci has-knowledge-of". Evidentment, quan hi ha una agregaci, les classes que Intervenen "es coneixen" l'una a l'altra. Per exemple, Empresa t coneixement de l'existncia dels Treballadors, pel que podrem dir en un principi que hi ha una relaci d'associaci entre Empresa i Treballador. Per, com que hem identificat que un Treballador "es-part-de" una Empresa, direm que hi ha Agregaci entre Empresa i Treballador en comptes de dir que hi ha una associaci (l'agregaci s una relaci ms forta que la d'associaci). La forma d'identificar associacions entre classes del domini s mirant si sempre podem accedir des d'una classe a una altra. Per exemple si tenim la classe Directiu amb un atribut que fa referncia al seu secretari, un directiu pot accedir sempre al seu secretari. Doncs, tenim una relaci d'associaci entre Directiu i Secretari. 3. s Es diu que s una "Relaci depends-on". s a dir, que per a funcionar la classe X depn de l'existncia de la classe Y. Per a que hi hagi una relaci d's entre la classe A i la classe B, amb una fletxa que va de A a B, en algun moment la classe A ha de cridar a algun mtode de la classe B. Nota: recordeu que els constructors d'una classe tamb sn mtodes. Quasi sempre que hi ha una relaci d'agregaci o d'associaci entre dues classes, hi ha tamb una relaci d's entre elles, al menys en una direcci. Per la relaci d's s la relaci ms feble que hi ha, i si hi ha altres relacions (agregaci o associaci) llavors ja no es dibuixa. Per exemple, com ja hem dit hi ha una relaci d'agregaci entre Empresa i Treballador (la llista de treballadors). Es veu bastant fcilment que tamb hi ha una relaci d's entre Empresa i Treballador, ja que Empresa depn de l'existncia de la classe Treballador per a funcionar. Nomenclatura:

102

- indica que un atribut o mtode s privat + indica que un atribut o mtode s pblic * indica que s una llista d'elements del tipus Per exemple: Tripulant* vol dir una llista d'objectes Tripulant.

En aquest diagrama sindica que les classes B i C hereten d'A. Tamb sindica que hi ha una relaci dagregaci entre B i D, una relaci dassociaci 1..* entre C i E, i una relaci ds entre E i F.

C 1

* D

* E

103

Arribat en aquest punt ja podem veure un exemple complet de Disseny de classes.

EXEMPLE DISSENY DE CLASSES


A lhora de programar en orientaci a lobjecte, cal tenir clar primer de tot, quines classes intervindran en el problema, amb quins atributs i quins mtodes. Anem a veure-ho amb un exemple: Suposem que hem de guardar les dades referents als alumnes i assignatures duna escola. Dels alumnes ens interessa saber-ne el nom i el DNI. Necessitarem doncs, crear una classe Alumne amb els atributs nom i dni. Aqu en tenim el codi: alumne.java Necessitem tamb saber les dades de les assignatures. En concret necessitem el nom i codi de les assignatures i quins alumnes fan cada assignatura. En el nostre cas tamb interessa saber quantes assignatures shan anat creant. Ens caldran tamb els segents mtodes: Un mtode que permeti afegir un alumne a lassignatura en curs Un mtode que ens permeti llistar els alumnes de lassignatura

El segent codi mostra com queda la classe assignatura: assignatura.java Necessitem tamb mantenir informaci sobre les assignatures i alumnes que hi ha en lescola. Per aix creem la classe Departament, que cont la llista dalumnes i assignatures que simparteixen a lescola i que gestiona la llista dalumnes i assignatures. departament.java Finalment, ens cal una classe que gestioni la entrada/sortida de dades. A aquesta classe lhem anomenat Secretaria. I s on es presenta el men dopcions a lusuari i es crida a les classes que calgui. secretaria.java

RELACIONS ENTRE CLASSES (II)

HERNCIA SIMPLE: La relaci IS A


Moltes vegades es crea un model de la realitat, una classe, i desprs es necessita una versi ms especialitzada del model original.

104

Per exemple, podem tenir creat el model dun empleat amb les seves dades, i necessitem el model de secretria, que tindr totes les dades de lempleat a ms daltres. Per tant, una secretaria s un empleat amb caracterstiques addiconals. public class empleat{ String nom; Date iniciFeina; Date dataNaixement; String titulacio; } public class secretaria{ String nom; Date iniciFeina; Date dataNaixement; String titulacio; String departament; empleat [ ] llistaempleats; } En aquest exemple veiem que hi ha duplicitat de dades per representar un empleat i una secretria, per a solucionar-ho, en Java sutilitza el mecanisme dherncia simple. Secretria heredar de la classe empleat tot el que necessiti a travs de la paraula reservada extends. public class secretaria extends empleat{ String departament; empleat [ ] llistaempleats; } Secretaria, a ms, es dir que s una subclasse dEmpleat. Tots els mtodes i caracterstiques (atributs) de la classe pare shereten a la subclasse. s important saber que, encara que una subclasse hereti tots els mtodes i variables de la classe pare, no hereta els constructors. Tamb cal remarcar que totes les classes que es crein hereten duna classe pare global que s la classe Object. Un altre exemple dherncia simple: punt.java Ara creem la classe PuntColor afegint un atribut i reescrivint el mtode moure: puntColor.java TIPUS DHERNCIA SIMPLE Bsicament ens trobem amb els segents tipus d'herncia: Herncia per subtipus o herncia simple per especialitzaci Herncia mltiple per especialitzaci Herncia per implementaci o herncia per generalitzaci (ja sigui simple o mltiple)

105

HERNCIA PER SUBTIPUS O HERNCIA PER ESPECIALITZACI: sn les ms comuens i corresponen a les herncies que hem vist en lexemple anterior. Un altre exemple: Tenim una classe Persona i necessitem modelar Clients, llavors creem la classe Client amb all que els distingeix de les persones (noms programem els atributs i mtodes de Client que no sn Persona). Es pot substituir la superclasse all on hi ha la subclasse perqu per exemple, tot Client s persona i t els atributs i mtodes de persona. La herncia per especialitzaci suposa partir d'una classe ja definida i crear-ne una altra de nova, que s una especialitzaci, una subclasse. En el mn dels conjunts les subclasses sn subconjuts. Per exemple, suposem que a partir de la classe Professor volem definir un tipus especial de professor, el ProfessorUniversitari, ja que t unes caracterstiques especials (per exemple, a banda de donar classes tamb ha de fer investigaci...). En el mn dels conjunts ProfessorUniversitari s un subconjunt del conjunt Professor:

Classe Professor

-----------/ \ / O maria \ / O joan \ | | | ------ Classe ProfessorUniversitari | josep O \ | \ | | / \ \ / / \ ------ / ------------

En l'exemple, de tot el conjunt de professors, noms josep pertany al subconjunt dels professors universitaris. Tots els professors sn professors universitaris? NO. Tots els professors Universitaris sn professors? S. Llavors pots considerar la superclasse en tot arreu on hi hagi la subclasse. Tot ProfessorUniversitari s Professor i tindria els "privilegis" dels professors. Un altre exemple: els AlumnesBecaris, no podrem considerar que tots els AlumnesBecaris tenen els privilegis dels Alumnes, perqu els Alumnes poden per exemple treballar. Per un AlumneBecari, pel fet de ja ser becat, doncs no podr treballar en segons qu. No tenim un cas d'herncia per subtipus. No pots substituir la superclasse all on hi ha la subclasse, per tant no estem en un cas d'herncia per subtipus. En aquest cas estem en un exemple d'herncia per implementaci. AlumneBecari no s un subtipus d'Alumne, per s tenen caracterstiques comunes, i per tant, es posen les caracterstiques comunes en la classe alumne. Herncia per generalitzaci (per implementaci) En el cas de l'herncia per generalitzaci tenim dues classes, A i B que sn semblants. Normalment el que passa es que ja tenem la classe A creada i, mentre estem creant la classe B, ens adonem que t coses semblants amb A. Com aprofitar el codi? Fent que tot el codi que sigui com a A i a B estigui en una classe de la qual heretin A i B alhora. Suposat que tens dues classes ja definides: AlumneBecari i Alumne Doctorat. Per, de sobte, te n'adones que tenen fora semblances. Llavors agafes tot all que tenen en com i et crees una nova classe d'alumne ms general (la classe Alumne). D'aix se'n diu Herncia per Generalitzaci

106

(Alumne s una generalitzaci d'AlumneBecari i AlumneDoctorat). Aquest tipus d'herncia se sol aplicar quan encara ests decidint les classes que participen en un problema: pensant te nadones que tens persones que sn AlumneBecaris", i ms tard tamb te'n adones que tens "AlumneDoctorats", i llavors dius... "Eep! aquestes dues classes s'assemblen... potser seria bo definir una que tingui les coincidncies de totes dues...". La herncia per generalitzaci (ja sigui simple o mltiple) va en sentit invers: hem definit una o ms classes i ens adonem que hi ha una classe ms general que les engloba. Per exemple: suposem que ja teniem definides les segents dos classes:

Classe Professor

-----------/ \ / O mari \ / O pep \ | | | | | josep O | \ / \ / \ / ------------

------------ Classe / \ Alumne / judit O \ / \ | | | joan O | | | \ O carles / \ / \ / ------------

Ara ens adonem que totes dues tenen coses en com. Tant un Alumne com un Professor tenen un nom, un DNI, una data de naixement.... sn coses que tenen en com perqu tots dos sn persones... doncs definim una superclasse, la classe Persona, que s un conjunt ms gran que els engloba a tots dos:

--------------------------------------- Classe / \ Persona / Classe Classe \ / Professor Alumne \ / ----------------------\ / / \ / \ \ / / O mari \ / judit O \ \ | / O pep \ / \ | | | | | | | | | | | joan O | | | | josep O | | | | \ \ / \ O carles / | \ \ / \ / / \ \ / \ / / \ ----------------------/ \ / \ / ---------------------------------------Ja per acabar falta el cas de la herncia mltiple per especialitzaci. En aquest cas definim una nova classe que hereta alhora de dues o ms classes ja existents. Aix vol dir que aquesta

107

classe esta formada pels elements que pertanyen a una classe i tamb a l'altre, s a dir, la intersecci dels dos conjunts. Suposem que, de sobte, ens recordem que en certes universitats alguns alumnes poden ajudar als professors, realitzant tasques docents: sn els becaris. Podrem dir que els becaris sn alumnes que fan certes feines d'un professor. Doncs, podrem definir la classe Becari per herncia mltiple, especialitzant a partir de la classe Alumne i la classe Professor. En el fons, el que ens hem adonat s que existeix una intersecci entre el conjunt d'alumnes i el conjunt de professors:

Classe Professor

----------------------- Classe / \ / \ Alumne / O maria X judit O \ / joan O / \ \ | | O | | | |eva| jordi O | | josep O | | | \ \ / O carles / \ X / \ /^\ / ------------ | -----------| Classe Becari

En l'exemple, l'objecte eva pertany a la classe Becari, que s la intersecci entre les classes Alumne i Professor.

La paraula reservada super


La paraula reservada super apunta a la superclasse de la classe en la qual sutilitza la paraula. Serveix per apuntar a alguna variable o mtode de la superclasse. Per exemple, amb les classes empleat i secretria tindrem els mtodes constructors segents: empleat.java secre.java

Loperador instanceOf
Com que els objectes es poden apuntar per variables definides del tipus de la classe pare, i aquests objectes es poden passar als mtodes, moltes vegades necessitem saber qu s el que realment hem passat. Aquesta s la funci de loperador instanceof. Vegem-ho amb un exemple: public class empleat [extends Object] public class secretaria extends empleat public class jefe extends empleat //No cal posar lextends perqu tota classe hereta dObject

108

Si en un mtode es reb un objecte apuntat per una variable de tipus empleat, pot ser que se li hagi passat una secretaria o un jefe. Es pot comprovar qu s, per mitj de loperador instanceof de la segent manera: public void metode(empleat e){ if (e instanceof secretaria){ ... } else if (e instance of jefe){ ... }else { // empleat normal } } Amb C++ es pot fer quelcom similar utilitzant runtime-type information. Aix doncs cal utilitzar instanceof per tal de verificar el tipus de lobjecte. En circumstncies en le que es tingui un objecte apuntat per una variable del tipus de la classe pare i se spigui que lobjecte s duna subclasse perqu sha comprovat grcies a loperador instanceof, es pot obtenir lobjecte de la subclasse fent una conversi del punter. public void metode(empleat e){ if (e instanceof secretaria){ secretaria m= (secretaria) e; System.out.println(El departament es +m.departament); } } Si no es fa la conversi i es prova daccedir a e.departament el compilador no troba el membre departament en la classe empleat.

Redefinici de mtodes
Si es vol crear una classe nova a partir duna ja existent, afegint-li caracterstiques noves, es pot modificar el seu comportament. Per a fer-ho, es defineix el mtode en la nova classe amb el mateix nom que la classe pare, el mateix tipus de retorn i la mateixa llista darguments. Es diu que el mtode del pare est redefinit. Recordatori: Els mtodes amb el mateix nom i llista de parmetres diferent, dins duna mateixa classe, sanomena sobrecrrega de mtodes. La llista de parmetres s el que indica al compilador quin s el mtode al que sest invocant. Per tal de redefinir un mtode cal tenir en compte el segent: El tipus de retorn dels dos mtodes ha de ser igual El mtode de la subclasse no pot ser menys accessible que el de la classe pare El mtode de la subclasse no pot provocar ms excepcions que el mtode pare.

VISIBILITAT DATRIBUTS I MTODES


Public: s un modificador que fa que els mtodes o classes siguin accessibles des de qualsevol lloc

109

Bsicament, si un atribut o un mtode sn privats, no sn visibles des de l'exterior de la classe (per a tothom que esta fora s com si no exists, ja que no ho poden veure). Com sabem quan utilitzar public i private? Si hem de deixar que el mtode o variable siguin accessibles des de fora de la classe, el fem public, sino el fem private. Els mtodes que apareixen en la interfcie han de declarar-se com a pblic, ja que volem que siguin accessibles (s a dir, que s'utilitzen en missatges) des del codi de fora de la classe. Els mtodes secundaris no apareixen en la interfcie. Noms apareixen amb la intenci de facilitar la implementaci dels mtodes pblics. No s necessari declarar-los com a pblic, per la qual cosa ho fem com a private. El mateix passa amb les variables: la seva funci la compleixen ajudant a la implementaci dels mtodes pblic, per la qual cosa les declarem tamb com a private. Protected: s un modificador, menys restrictiu que el private public: Ocultaci nulla... es pot veure des de qualsevol classe protected: Ocultaci parcial... noms es pot veure des de la mateixa classe i des de les subclasses private: Ocultaci total... noms es pot veure des de la mateixa classe

Si tenim una classe "Z" amb atributs privats i una classe "M" que hereta la classe "Z" aquesta pot utilitzar els atributs de la "Z" si aquests els hem declarat com privats? Si la visibilitat s "privat" la resposta s NO; si la visibilitat s "protegit" la resposta s SI. Comprovem-ho! T mateix pots fer el segent exemple: a.java b.java Al compilar a.java tot va b... per al fer javac B.java surten els segents errors: B.java:11: Undefined variable: cognoms return (cognoms + ", " + nom); ^ B.java:11: Undefined variable: nom return (cognoms + ", " + nom); ^ 2 errors

MODIFICADOR ABSTRACT
Si a una classe li posem el modificador abstract la convertim en una classe abstracta, aquestes classes sn aquelles que tenen un o ms mtodes que estan definits com abstractes i que no es

110

codifiquen en aquesta classe, sin en les classes filles daquesta classe abstracta. Per tant aix ens obliga a heretar daquesta classe, doncs no es poden instanciar, perqu li falten mtodes que shan de codificar en les classes filles. Els mtodes que no shan implementat en la classe, shan de marcar tamb com a abstract. No es pot crear una instncia duna classe abstracta No es poden definir constructors abstractes o mtodes esttics abstractes Les subclasses de les classes abstractes han dimplementar tots els mtodes abstractes que shan declarat en les classes pare.

MODIFICADOR FINAL
El modificador final fa que les classes definides com a finals no es puguin heretar, doncs s una classe final, una classe don no t sentit heretar per que ja hem arribat al final de la possible jerarquia de classes. Aquest modificador saplica per tal de que la classe en endavant no pugu ser modificada. Per exemple, la classe java.lang.String que proporciona el propi llenguatge s una classe de tipus final. Els mtodes tamb poden definir-se com a finals. Els mtodes marcats amb la paraula reservada final no es poden sobreescriure o redefinir. Un mtode es defineix final, si el mtode t una implementaci que no es pot canviar, perqu per exemple posa en perill la consistncia de la classe. ATENCI!! Els mtodes marcats com a esttics o privats (amb les paraules reservades static o private) sn final automticament. RECORDATORI: Si una variable es marca amb la paraula reservada final, es converteix en una constant. T sentit en programaci orientada a objectes posar els modificadors abstracte i final a la vegada en una mateixa classe? No t sentit posar els mofidicadors abstract final a la vegada en una classe, doncs una ens obliga a heretar della, el modificador abstract i laltre modificador ens fa que la classe sigui final i no es pugui heretar della, per lo que no t sentit definir una classe abstracte i final. A ms a ms, en cas concret del llenguatge Java, el mateix compilador ens donar error en fer la declaraci.

111

BREU INTRODUCCI A UML


El Llenguatge Unificat de Modelat (UML - Unified Modeling Language) s un llenguatge grfic i flexible de modelat que permet descriure models que representin sistemes (tan software comdel mn real) basant-se amb els conceptes de l'orientaci a objectes. L'especificaci, implementaci, prova i documentaci d'un sistema amb gran quantitat de software requereix que el sistema sigui vist des de diferents perspectives. Diferents usuaris (usuaris finals, analistes, desenvolupadors, integradors de sistemes, encarregats dels tests,encarregats de la documentaci tcnica, caps de projectes...) miren el sistema des de diferents punts de vista en diversos moments al llarg de la vida del projecte. Sn els diagrames (una representaci grfica d'un conjunt d'elements) els que permeten visualitzar un sistema des de diferents perspectives, de forma que un diagrama s una projecci d'un sistema. UML proporciona fins a nou diagrames diferents que permeten cobrir tot el ventall de les diferents vistes del sistema que requereixen aquests usuaris. En aquest document noms s'estudiar un d'aquests diagrames, possiblement el diagrama ms com i ms utilitzat en el modelat de sistemes orientats a objectes (s l'nic diagrama al que es fa esment en l'assignatura), estem parlant del diagrama de classes.

1. Diagrama de Classes
Un diagrama de classes permet definir un model que descriu un sistema, concretament permet dissenyar un model esttic del sistema. Un diagrama de classes descriu la visi esttica del sistema en termes de classes i de les relacions entre aquestes. Encara que t similituds amb els models de dades, recordeu que les classes no noms estructuren la informaci sin que tamb descriuen el seu comportament. En un diagrama de classes noms hi ha classes. Per crear un diagrama de classes, cal identificar i descriure cada una de les classes i, en cas d'haver-n'hi varies, aquestes poden relacionar-se entre elles mitjanant diferents tipus de relacions que tamb han de quedar reflectides en el diagrama. Una classe es dibuixa mitjanant un rectangle dividit en tres compartiments, el compartiment del nom, el dels atributs i finalment el de les operacions. Vegeu-ho en la segent figura.

La sintaxi que s'usa en cada compartiment s independent dels llenguatges de programaci que es puguin utilitzar en el moment de la implementaci.

1.1. El Compartiment del Nom


El compartiment superior del rectangle cont el nom de la classe; s'escriu en negreta i centrat. El nom ha d'sser derivat del domin del problema (ha de ser significatiu), ha de ser el menys 1ambigu possible i ha de ser un nom el ms simple possible. Normalment, el nom de la classe comena amb majscules i en cas de ser compost es posa la primera lletra de cada paraula en majscules.

1.2. El Compartiment dels Atributs


Les classes tenen atributs que descriuen les caracterstiques de l'objecte. Els atributs d'una classe emmagatzemen la informaci que descriu i identifica una instncia especifica de la classe. Per cada classe, noms cal incloure els atributs que ens interessin per al disseny del sistema. Per a cada atribut, cal especificar-ne el seu nom, ':' i el seu tipus. El tipus d'un atribut pot ser qualsevol classe o b un tipus primitiu (int, char, ...). Exemple: pos:Posicio

112

Els atributs tenen diferent visibilitat. La visibilitat pblica indica que l'atribut s visible, i per tant pot ser referenciat, des d'altres classes. Aix s'expressa en el diagrama amb el signe ms (+). La visibilitat privada indica que l'atribut noms pot ser visible per la mateixa classe. S'expressa amb el signe menys (-). Finalment, tenim la visibilitat protegida que s'expressa amb el signe (#) i indica que l'atribut pot ser visible per la classe i tota la seva descendncia. La visibilitat (+,-,#) s'indica davant de l'atribut. Exemple: -pos:Posicio El Compartiment d'Operacions Les operacions permeten manipular els atributs o executar altres accions que defineixen el comportament de l'objecte. Per descriure una operaci o mtode, cal indicar la seva signatura, s a dir: un nom, entre parntesi, zero o ms parmetres (per cada parmetre s'ha d'indicar: nom del parmetre ':' tipus del parmetre) separats per comes, ':' i el tipus de retorn si n'hi ha. Exemples: getPos(): Posicio resize(precentX: Integer, percentY:Integer) Els mtodes en una classe descriuen el que poden fer i els serveis que poden oferir les instncies d'aquesta classe. Es diu tamb que els mtodes sn la interfcie de la classe. Com els atributs, els mtodes poden tenir una visibilitat. La visibilitat pblica indica que el mtode s visible, i per tant referenciat, des d'altres classes. S'expressa en el diagrama amb el signe ms (+). La visibilitat privada indica que el mtode noms pot ser visible per a la mateixa classe. S'expressa amb el signe menys (-). Finalment, tenim la visibilitat protegida que s'expressa amb el signe (#) i indica que el mtode pot ser visible per la classe i tota la seva descendncia. La visibilitat (+,-,#) s'indica davant del mtode. Exemple: +dibuixa() Vegem ara la definici UML completa de la classe Figura:

1.4. Relacions entre Classes


Una relaci es pot definir com una connexi entre elements. En modelat d'objectes, les principals relacions que es poden establir sn: Associacions Les associacions representen relacions (estructurals) entre instncies de classes. En UML, es defineix una associaci com una relaci que descriu un conjunt de vincles, on vincle es defineix com una connexi semntica entre classes. Un exemple d'associaci podria ser el fet de que una persona treballa per una empresa, o que una empresa tcerta quantitat d'oficines. Agregacions L'agregaci s un tipus especial d'associaci on la relaci que s'estableix entre les instncies s del tipus "part d'un tot". Per exemple, les rodes, els llums o el xasss, sn parts d'un cotxe.

113

Generalitzacions(herncia) Una generalitzaci s una relaci entre un element general (superclasse o pare) i un de ms especfic (subclasse o fill). Normalment, l'element ms especfic (el fill) cont noms informaci addicional respecte al ms general (el pare). Una instncia de l'element ms especfic es pot usar com si fos l'element ms general. Un exemple de generalitzaci pot ser la relaci entre Persona (classe ms general) i Empleat (classe ms especfica). Dependncies(usos) Una dependncia s una relaci d'us (un element n'utilitza un altre) que especifica que un canvi en l'especificaci d'un element pot afectar a un altre element que l'utilitza per no necessriament a la inversa. Un exemple de dependncia pot ser un Controlador d'accs a una aplicaci que usa l'objecte PantallaIdentificaci per recollir les dades d'identificaci de l'usuari.

1.5.1 Associaci
Una associaci s una connexi entre classes, una connexi semntica (vincle) entre objectes de les classes involucres en l'associaci. Una associaci s normalment bidireccional. Aix implica que ambds objectes estan "a l'aguait" l'un de l'altre. Una associaci indica que els objectes de les dues classes haurien de tenir un vincle entre ells. Per exemple: els dos objectes es coneixen, estan connectats, un objecte X cont un conjunt d'objectes Y... L'associaci es representa grficament mitjanant una lnia slida entre les dues classes. L'associaci pot tenir un nom (normalment es tracta d'un verb). Quan es modela un diagrama, aquest ha de reflexar, el ms fidelment possible, el sistema que s'est construint, per tant, s recomanable que el nom de l'associaci provingui del domini del problema. Una associaci, si no es diu el contrari, s bidireccional (es pot navegar en les dues direccions). Hi ha certes situacions, en les que conv restringir la navegaci en alguna de les dues direccions. Aix es pot fer afegint una fletxa al final de l'associaci, la fletxa indica que l'associaci noms es pot usar en aquella direcci. Una associaci pot tenir dos noms, un per cada direcci. La direcci de cada etiqueta s'indica mitjanant un triangle opac on la punta indica la direcci i a la part de la base s'hi posa l'etiqueta de l'associaci. Es pot llegir una associaci des d'una classe a l'altra, com en la segent figura: "Un autor usa un computador".

Ens podem fixar, que aqu noms tenim un rectangle amb el nom de la classe i no pas tota la seva descripci (nom, atributs i mtodes). Aix s per simplificar i perqu els diagrames surtin ms compactes i ms fcils de llegir, per hauria d'existir un diagrama previ on cada classe estigus totalment especificada. Per altre banda, tant les associacions com les altres relacions, poden tenir un quantificador que indica quants objectes estan vinculats. El rang pot ser de zero a un (0..1), de zero a molts (0..* ), de un a molts (1..*), dos (2), de cinc a onze (5..11), etc. Si no s'especifica una multiplicitat es pren per defecte (1). Aquest rang apareix al principi i a al final de la relaci. Exemples: Una associaci normal entre dues classes representa una relaci estructural entre iguals, s a dir, les dues classes estan conceptualment al mateix nivell, sense ser una ms important que l'altra. Hi ha per associacions amb altres particularitats: les agregacions.

114

1.5.2 Agregaci
Ja s'havia dit que l'agregaci s un tipus especial d'associaci on la relaci que s'estableix entre les instncies s del tipus "part d'un tot". s a dir, que hi ha una classe que representa un element gran (el tot) que consta d'elements ms petits (les parts). L'exemple que s'havia posat era el del cotxe, que est format per quatre rodes, un motor , un xasss, una caixa de canvis ... Un altre exemple d'agregaci pot ser una flota que cont molts vaixells de guerra. Les parts (els vaixells de guerra) composen el tot (la flota). En aquest figura (que reflexa l'exemple de la flota i els vaixells) es pot veure com s'especifica grficament una agregaci. El diamant buit que hi ha a la part del "tot", s el smbol que indica que aquesta associaci s una agregaci.

1.5.3 Generalitzaci
La generalitzaci s una relaci entre una classe general i una d'especfica. La generalitzaci s una relaci entre classes, mai entre instncies (una classe pot heretar d'una altra per un objecte noms existeix en temps d'execuci i no t sentit parlar d'herncia a nivell d'objectes) encara que les instncies estan indirectament afectades (polimorfisme) per el seu tipus. Una generalitzaci s anomenada, a vegades, una relaci "s-un", on s'ha de poder dir que l'element ms especfic "s-un" element ms general (un cotxe s un vehicle, un directiu s un treballador, etc.). La classe especfica s'anomena subclasse, ho hereta tot de la classe general (la superclasse). Concretament s'hereten els atributs, mtodes i totes les associacions. Els atributs i mtodes que eren pblics en la superclase ho seran tamb en la subclasse. Els membres (atributs i mtodes) que tenen la visibilitat privada a la superclasse s'hereten, per no sn accessibles dins de la subclasse. Per protegir atributs i/o mtodes de la superclasse i de la subclasse de l'accs extern per que si que siguin accessibles per ambdues, podem fer aquests membres protegits (un membre protegit no pot ser accedit per altres classes per s perms l'accs des de la classe i des de qualsevol de les seves subclasses). Grficament, una generalitzaci es representa com una lnia slida des de la classe ms especifica (la subclasse) cap a la classe ms general (la superclasse) acabada amb un gran triangle buit. Veure la segent figura:

En aquesta figura, el vehicle s la classe general (superclasse) i d'ella hereten les classes especifiques (subclasses) Cotxe, vaixell i Cami.

115

1.5.4 Dependncia
A ms a ms de l'associaci i la generalitzaci existeix una altra relaci en UML, la relaci de dependncia. La relaci de dependncia es una connexi semntica entre dos elements on un element s dependent de l'altre. Un canvi en l'element independent afectar al dependent per no a la inversa. Sn exemples de dependncies: Una classe que pren un objecte d'una altra classe com a parmetre en algun dels seus mtodes; o una classe que crida a membres esttics d'una altra classe... En tots aquests casos hi ha una dependncia d'una classe respecta a una altra encara que no hi ha una associaci explcita entre ells. La relaci de dependncia es representa grficament com una fletxa puntejada que apunta a l'element que s'usa.

La classe A usa la classe B, per tant, pot accedir (usar) membres pblics de la classe B. Exemple: La classe A crea instncies de la classe B (fa crides al constructor de la classe B).

2. Referncies:
http://www.omg.org http://www.rational.com/index.jtmpl http://uml.shl.com G. Booch, J. Rumbaugh, I. Jacobson, The Unified Modeling Language User Guide, Addison Wesley, 1999 (traducci castellana: El Lenguaje Unificado de Modelado, Addison Wesley)

116

BIBLIOGRAFIA RECOMANADA Introduccin a la programacin con JAVA. Un enfoque orientado a objetos David Arnow / Gerald Weiss Editorial Addison Wesley Cmo programar en Java Deitel y Deitel Editorial Prentice Hall

117

GLOSSARI API: un conjunt de rutines (procediments i funcions que en la sintaxi de la programaci orientada a lobjecte sanomenen mtodes) que el llenguatge ofereix al programador array: Tipus de dades que permeten emmagatzemar un conjunt de dades a travs de determinats ndexos. atributs o variables dinstncia: Els atributs d'una classe emmagatzemen la informaci que descriu i identifica una instncia especifica de la classe. Per cada classe, noms cal incloure els atributs que ens interessin per al disseny del sistema. Per a cada atribut, cal especificar-ne el seu nom, ':' i el seu tipus. El tipus d'un atribut pot ser qualsevol classe o b un tipus primitiu (int, char, ...). atributs static o variables de classe: Atributs accessibles des de qualsevol instncia duna classe. Un exemple s un comptador dinstncies creades duna classe. bytecodes: Resultat de la compilaci darxius codi font java i que es carreguen, verifiquen i executen en lintrpret. classe: Element bsic de la Programaci Orientada a lobjecte. Una classe s una descripci de lestructura i el comportament dels objectes que pertanyen a la classe. garbage collection: procs que rastreja les operacions de reserva de memria i automticament allibera la memria que no es necessita. mtode: operacions, procediments o funcions que treballen sobre les dades que representen un objecte. mtodes accessors o getters: Sn mtodes que permeten conixer, sense alterar, lestat de lobjecte. mtodes constructors: Sn mtodes que permeten la construcci de lobjecte. mtodes modificadors o setters: : Sn mtodes que permeten alterar lestat (valors de les variables dinstncia) de lobjecte. mtode static: els mtodes amb el modificador static sn propis de la classe, sense que sapliquin especficament sobre cap objecte de la classe. s a dir, poden ser utilitzats sense crear cap instncia de la classe. A aquests mtodes tamb sels anomena mtodes de classe. missatge: s el mecanisme pel qual s'invoca a un mtode. Un missatge consisteix en el nom del mtode seguit d'una llista_parmetres que pot ser buida. objecte: Un Objecte es pot definir com una agrupaci o collecci de dades i operacions que tenen una estructura determinada i mitjanant la qual es poden modelar aspectes rellevants dun problema. private: Modificador que fa que tota la informaci declarada com a private tingui ocultaci total... noms s accessible des de la mateixa classe. protected: Modificador que fa que tota la informaci declarada com a protected tingui ocultaci parcial: noms s accessible des de la mateixa classe i des de les subclasses . public: Modificador que fa que tota la informaci (sigui mtode, atribut o classe) declarada public sigui accessible des de fora de la classe. Aix, en altres classes es podr accedir a qualsevol dels mtodes aix definits.

118

sobrecrrega: Definici dun mateix tem amb diferents significats, de manera que en funci de la manera que sutilitzi pot interpretar-se el seu significat. super: La paraula reservada super apunta a la superclasse de la classe en la qual sutilitza la paraula. Serveix per apuntar a alguna variable o mtode de la superclasse. this: El llenguatge Java inclou una referncia especial anomenada this, que sutilitza dins de qualsevol mtode per tal de poder referenciar a lobjecte actual. El valor this es refereix a lobjecte sobre el qual sha cridat el mtode actual UML: El Llenguatge Unificat de Modelat (UML - Unified Modeling Language) s un llenguatge grfic i flexible de modelat que permet descriure models que representin sistemes (tan software comdel mn real) basant-se amb els conceptes de l'orientaci a objectes. vector: Classe del llenguatge Java que permet emmagatzemar un conjunt de dades a travs de determinats ndexos

119

FIGURES Exemple 1 p.java


class p { static void f(int i) { System.out.println(++i); } public static void main(String[] args) { int n = 5; System.out.println(n); f(n); System.out.println(n); } }

Exemple 2 p1.java
class CompteBancari { long numero; String titular; long saldo; } class p1 { static void arruinar(CompteBancari c) { c.saldo = 0; c = null; } public static void main(String[] args) { CompteBancari ct = new CompteBancari(); ct.saldo = 100000; System.out.println(ct.saldo); arruinar(ct); System.out.println(ct.saldo); } }

120

p2.java class p2{ static void f(int x[]){ x[3]=0; x=new int[8]; x[3]=5; } public static void main(String[] args) { int a[]={5,4,3,2,1}; System.out.println(a[3]); f(a); System.out.println(a[3]); } } provaTriangle.java
class triangle { double base; double alada; } class provaTriangle { public static void main(String[] args) { triangle t1 = new triangle(); triangle t2 = new triangle(); t1.base = t1.alada t2.base = t2.alada } } 7; = 8; 8; = 10;

System.out.println("Area triangle 1:" + ((t1.base * t1.alada) / 2));

121

provaTriangle2.java
class triangle2 { private double base; private double alada; public triangle2() { } public double area() { return ((base * alada) / 2); } public double getBase() { return (base); } public double getAlada() { return (alada); } public void setBase(double bas) { base = bas; } public void setAlada(double al) { alada = al; } }

class provaTriangle2 { public static void main(String[] args) { triangle2 t = new triangle2(); t.setBase(7); t.setAlada(10); double a = t.area(); System.out.println("Area " + a); } }

122

mesProva.java
class triangle3 { private double base; private double alada; public triangle3() { } // primer constructor public triangle3(double bas, double al) { // base = bas; alada = al; } segon constructor

public triangle3(double mesura) { // tercer constructor base = mesura; alada = mesura; } public double area() { return ((base * alada) / 2); } public double getBase() { return (base); } public double getAlada() { return (alada); } public void setBase(double bas) { base = bas; } public void setAlada(double al) { alada = al; } }

class mesProva { public static triangle3 triangle3 triangle3 } }

void t1 = t2 = t3 =

main(String[] args) { new triangle3(); new triangle3(2.5, 3.5); new triangle3(34.2);

123

sumar.java
public class sumar { public static float suma(float a, float b) { System.out.println("Suma de reals"); return a + b; } public static int suma(int a, int b) { System.out.println("Suma d'enters"); return a + b; } public static void main(String[] args) { float x = 1; float y = 2; int v = 3; int w = 5; System.out.println(suma(x, y)); System.out.println(suma(v, w)); }

rectangle2.java
public class rectangle2 { private float x1; private float y1; private float x2; private float y2; public x1 x2 y1 y2 } public x1 x2 y1 y2 } rectangle2(float ex1, float ey1, float ex2, float ey2) { = ex1; = ex2; = ey1; = ey2; rectangle2() { = 0; = 0; = 1; = 1;

public float calcularArea() { return (x2 - x1) * (y2 - y1); } public static void main(String[] args) { rectangle2 prova1 = new rectangle2(1, 4, 7, 6); rectangle2 prova2 = new rectangle2(); System.out.println(prova1.calcularArea()); System.out.println(prova2.calcularArea()); } }

124

triangle4.java
class triangle4 { private double base; private double alada; public triangle4(double base, double alada) { this.base = base; this.alada = alada; } }

compte.java
class compte { public double saldo; public String idCompte; // constructor opertura compte public compte(String id) { saldo = 0; idCompte = id; } public double getSaldo() { return saldo; } public String getidCompte() { return idCompte; } public void ingressar(double diners) { saldo += diners; } public void transferencia(compte origen) { saldo += origen.saldo; origen.saldo = 0; } }

provaCompte.java
public class provaCompte { public static void main(String[] args) { compte cc1; compte cc2; cc1 = new compte("x32001-a2"); cc1.ingressar(100000); cc2 = cc1; cc1.transferencia(cc2); System.out.println("Saldo primer compte: " + cc1.getSaldo() + " Saldo segon compte: " + cc2.getSaldo()); } }

125

provaCompte2.java
class compte2 { public double saldo; public String idCompte; // constructor opertura compte public compte2(String id) { saldo = 0; idCompte = id; } public double getSaldo() { return saldo; } public String getidCompte() { return idCompte; } public void ingressar(double diners) { saldo += diners; } public void transferencia(compte2 origen) { if (this.idCompte.equals(origen.idCompte)) { System.out.println("Error de transferencia entre comptes iguals"); } else { saldo += origen.saldo; origen.saldo = 0; } } }

public class provaCompte2 { public static void main(String[] args) { compte2 cc1; compte2 cc2; cc1 = new compte2("x32001-a2"); cc1.ingressar(100000); cc2 = cc1; cc1.transferencia(cc2); System.out.println("Saldo primer compte: " + cc1.getSaldo() + " Saldo segon compte: " + cc2.getSaldo()); } }

126

prova.java
public class prova { private int i = 0; prova successor() { i++; return this; } prova escriure() { System.out.println(i); return this; } public static void main(String[] args) { prova x = new prova(); x.successor().successor().escriure(); } }

rectangle3.java
public class rectangle3 { private float x1; private float y1; private float x2; private float y2; public x1 x2 y1 y2 } rectangle3(float ex1, float ey1, float ex2, float ey2) { = ex1; = ex2; = ey1; = ey2;

public rectangle3() { this(0, 0, 1, 1); } public float calcularArea() { return (x2 - x1) * (y2 - y1); } public static void main(String[] args) { rectangle3 prova1 = new rectangle3(1, 4, 7, 6); rectangle3 prova2 = new rectangle3(); System.out.println(prova1.calcularArea()); System.out.println(prova2.calcularArea()); } }

127

provaEx.java
class exemple { static int comptador = 0; int x; public exemple() { comptador++; } } class provaEx { public static void main(String[] args) { exemple exe1 = new exemple(); exemple[] vexe = new exemple[100]; for (int i = 0; i < 100; i++) vexe[i] = new exemple(); int numTotal = exemple.comptador; System.out.println("Nombre: " + numTotal); } }

laFuncio.java us.java public class laFuncio { public static int afegeix(int x, int y) { return x + y; } } public class us { public static void main(String[] args) { int a = 9; int b = 10; int c = laFuncio.afegeix(a, b); System.out.println("afegeix() dona " + c); } } alumne.java
public class alumne { String nom; long dni; public alumne(String str, long n) { nom = str; dni = n; } public String toString() { return (nom + " " + dni); } }

128

assignatura.java
import java.util.*; public class assignatura { private static long nassignatures = 0; String nom; long codi; private Vector alumnes = new Vector(); public assignatura(String str) { nom = str; codi = generarCodi(); } private static long generarCodi() { return nassignatures++; } public void matricular(alumne al) { alumnes.addElement(al); } public String toString() { return "Assignatura: " + nom + "\tCodi: " + codi; } public String llistaAlumnes() { Enumeration enum = alumnes.elements(); StringBuffer llista = new StringBuffer("Alumnes matriculats:\n"); while (enum.hasMoreElements()) { alumne alumne = (alumne) enum.nextElement(); llista.append(alumne.toString() + "\n"); } return llista.toString(); } }

departament.java
import java.util.*; public class departament { private Vector assignatures = new Vector(); private Vector alumnes = new Vector(); public void matricular(alumne al, assignatura assig) { assig.matricular(al); } public alumne nouAlumne(String nom, long dni) { alumne alumne = new alumne(nom, dni); alumnes.addElement(alumne); } return alumne;

129

public alumne buscarAlumne(long dni) { Enumeration enum = alumnes.elements(); while (enum.hasMoreElements()) { alumne alumne = (alumne) enum.nextElement(); if (alumne.dni == dni) { return alumne; } } return null; } public assignatura novaAssignatura(String nom) { assignatura assig = new assignatura(nom); assignatures.addElement(assig); return assig; } public assignatura buscarAssignatura(long codi) { Enumeration enum = assignatures.elements(); while (enum.hasMoreElements()) { assignatura assignatura = (assignatura) enum.nextElement(); if (assignatura.codi == codi) { return assignatura; } } return null; } public String llistaAssignatures() { Enumeration enum = assignatures.elements(); StringBuffer llista = new StringBuffer(); while (enum.hasMoreElements()) { assignatura assignatura = (assignatura) enum.nextElement(); llista.append(assignatura.toString() + "\n"); } return llista.toString(); } }

130

secretaria.java
import java.io.*; public class secretaria { static BufferedReader reader = new BufferedReader(new InputStreamReader( System.in)); static long readLong() throws IOException { return Integer.valueOf(readln()).longValue(); } static String readln() throws IOException { return reader.readLine(); } static void matricularAlumne(departament dpt) throws IOException { System.out.print("DNI alumne: "); long dni = readLong(); alumne alumne = dpt.buscarAlumne(dni); if (alumne == null) { System.out.print("Nom: "); String nom = readln(); alumne = dpt.nouAlumne(nom, dni); } System.out.print("Codi assignatura: "); long codi = readLong(); assignatura assignatura = dpt.buscarAssignatura(codi); if (assignatura == null) { System.out.println("Assignatura no existeix"); return; } dpt.matricular(alumne, assignatura); System.out.println("Operacio realitzada"); } static void novaAssignatura(departament dpt) throws IOException { System.out.print("Nom assignatura: "); String nom = readln(); assignatura assignatura = dpt.novaAssignatura(nom); System.out.println(assignatura.toString()); } static void mostrarMatriculats(departament dpt) throws IOException { System.out.print("Codi Assignatura: "); long codi = readLong(); assignatura assignatura = dpt.buscarAssignatura(codi); if (assignatura == null) { System.out.println("Assignatura no existent");

131

return; } System.out.println(assignatura.llistaAlumnes()); } static void mostrarAssignatures(departament dpt) throws IOException { System.out.println(dpt.llistaAssignatures()); } public static void main(String[] args) throws IOException { departament dpt = new departament(); int opcio; do { System.out.println("Tria la opcio"); System.out.println(" 1. Matricular alumne"); System.out.println(" 2. Crear nova assignatura"); System.out.println(" 3. Mostrar assignatures"); System.out.println(" 4. Mostrar alumnes matriculats"); System.out.println(" 5. Acabar"); System.out.print("Tecleja la opcio "); opcio = (int) readLong(); switch (opcio) { case 1: matricularAlumne(dpt); break; case 2: novaAssignatura(dpt); break; case 3: mostrarAssignatures(dpt); break; case 4: mostrarMatriculats(dpt); break; case 5: break; } } while (opcio != 5); } }

132

punt.java
class punt { int x; int y; float norm() { return (x * x) + (y * y); } punt borrar() { x = y = 0; return this; } punt moure(int dx, int dy) { x += dx; y += dy; return this; } }

puntColor.java
class puntColor extends punt { String c; boolean esblanc() { return c.equals("white"); } punt moure(int dx, int dy) { x += dx; y += dy; c = "white"; return this; } }

133

empleat.java secre.java
public class empleat { String nom; String titulacio; public empleat(String a, String tit) { nom = a; titulacio = tit; } } public class secre extends empleat { String departament; empleat[] llistaempleats; public secre(String a, String tit, String d) { super(a, tit); departament = d; llistaempleats = new empleat[20]; } }

a.java b.java public class a { private String nom; private String cognoms; public a(String nom, String cognoms) { this.nom = nom; this.cognoms = cognoms; } public String toString() { return (nom + " " + cognoms); }

public class b extends a { public b(String nom, String cognoms) { super(nom, cognoms); } public String toStringInverso() { return (cognoms + ", " + nom); } }

134

IBM Rational software

Select a country All software products Rational Products Try It Center Success stories

Home | Products & services | Support & downloads | My account Software >

Become a member News Events How to buy Services Support Training & certification Business partners About Rational Related links: DB2 Data Management Lotus Tivoli WebSphere Contact Rational Site Map Software development lifecycle Requirements & analysis Integrated tools for requirements management, use case development, business modeling, and data modeling. Visual modeling & development Tools that automate and accelerate software construction. Automated testing Tools that address all dimensions of software quality: functionality, reliability, and performance. Project management Solutions that minimize risk by providing team-based requirements management, reporting and progress measurement. Software configuration management Solutions that help you manage the impact of change through comprehensive version control and defect and change tracking. Configurable process Solutions that provide the entire team with a customizable roadmap to software development success. Solutions for building... Business/IT applications Embedded applications Systems & software development Java software .NET software News UML 2.0: Designed to support several model-driven development paradigms. Globalize your e-business with Rational Rapid Developer Download the most recently released Rational ClearCase patches for all platforms. WebSphere Advisor Magazine: Rational, WebSphere, and You More news Events and education Rational User Conference 2003: Aug. 24-28 - Orlando, Fla. Be the first in your field to try out our new Essentials of Rational Rose RealTime, an instructor-led course delivered online. New courses available from Rational University, including new
http://www.rational.com/index.jsp (1 of 2) [03/07/2003 17:31:24]

Rational member ID Password

Remember me Forgot member information? Looking for support & downloads? The help you need is a click away. Announcing v2003 Rational expands the reach of software development tools. Rational Developer Network Everything you need to learn and use Rational tools.

IBM Rational software

course for Rational Rapid Developer More events More education

Information for: Analysts Developers Project managers Testers Partners Government Resources: UML Resource Center Rational Developer Network The Rational Edge Software engineering leadership

About IBM | Privacy | Legal | Contact

http://www.rational.com/index.jsp (2 of 2) [03/07/2003 17:31:24]

You might also like