|
|
(Hi ha 2 revisions intermèdies del mateix usuari que no es mostren) |
Línia 1: |
Línia 1: |
− | torna [[ M3 - Programació ]]
| |
| | | |
− | == Programació Orientada a objectes (POO) ==
| |
− |
| |
− | La POO és un paradigma de programació.
| |
− |
| |
− | Es representa el sistema com una col·lecció d’objectes amb certes propietats.
| |
− |
| |
− | Aquests reben estímuls externs o esdeveniments interns, i en resposta:
| |
− |
| |
− | * Intercanvien informació
| |
− | * Canvien el seu '''estat '''(Les seves propietats)
| |
− | * Produeixen resultats observables (Informació per consola, creació d'un botó, etc...)
| |
− |
| |
− | Les responsabilitats del Sistema queden així repartides entre els objectes que col·laboren entre ells
| |
− |
| |
− | Per comunicar-se els objectes intercanvien '''''missatges'''''. (Crides a mètodes)
| |
− |
| |
− | == Les Classes i els objectes ==
| |
− |
| |
− | Una '''classe''' descriu la estructura d'entitats del mateix tipus. Cadascuna d'aquestes entitats s'anomena '''objecte'''.
| |
− |
| |
− | La classe recull totes les propietats i comportaments comuns d’aquestes entitats, però no les que difereixen.
| |
− |
| |
− | Els '''objectes''' són instàncies d’una classe, representen un estat real d’un classe on les propietats que defineixen la classe tenen un valor concret.
| |
− |
| |
− | Es poden descriure els objectes des d’un punt vista
| |
− |
| |
− | * Estàtic: El valor de les seves propietats, '''atributs''' (''Estat'')
| |
− | * Dinàmica: Com respon a esdeveniments externs, '''mètodes''' (''Comportament'')
| |
− |
| |
− | [[File: ObjectClass.png]]
| |
− |
| |
− |
| |
− | === Descripció estàtica. Atributs ===
| |
− |
| |
− | Els atributs, poden ser de dos tipus segons l’àmbit:
| |
− |
| |
− | * Atributs '''d’instància''' poden tenir un valor diferent per a cada objecte.
| |
− | * Atributs '''de classe'''. Tenen el mateix valor per a tots els objectes de la classe. Només hi ha una còpia de l'atribut que comparteixen tots els objectes de la classe.
| |
− |
| |
− | Es defineixen diferents nivells d’accés sobre els atributs, de manera general:
| |
− |
| |
− | * Visibilitat '''pública''': Atributs accessibles externament.
| |
− | * Visibilitat '''privada''': Només accessibles internament.
| |
− | * Visibilitat '''protegida''': Només accessibles internament i des dels descendents.
| |
− |
| |
− | === Descripció dinàmica. Mètodes ===
| |
− |
| |
− |
| |
− | Pot haver-hi quatre tipus de operacions o mètodes:
| |
− |
| |
− | * '''Constructors i destructors''': Els primers es criden en el moment que s’instancia una classe, o sigui quan es crea un objecte. Tenen el mateix nom que la classe. Java no necessita destructors.
| |
− | * '''Modificadors''' (Setter): Permeten modificar el valor d’un atribut
| |
− | * '''Consultors''' (Getter): Permeten obtenir el valor d’un atribut
| |
− | * '''Altres'''. Qualsevol altre mètode
| |
− |
| |
− | Les operacions també poden tenir diferents àmbit:
| |
− |
| |
− | * Operacions '''d’objecte'''. S’apliquen als objectes de la classe.
| |
− | * Operacions '''de classe'''. S’apliquen a la classe (Per exemple les operacions constructores i destructores, i els Getter/Setter sobre atributs de classe).
| |
− |
| |
− |
| |
− | Els nivells d’accés sobre els mètodes,de manera general:
| |
− |
| |
− | * Visibilitat '''pública''': Atributs accessibles externament.
| |
− | * Visibilitat '''privada''': Només accessibles internament.
| |
− |
| |
− |
| |
− | ''Exemple''
| |
− |
| |
− | {|
| |
− | | [[File: alumne.jpg]]
| |
− | |
| |
− | (+) Significa public
| |
− |
| |
− | (-) Significa privat
| |
− |
| |
− | Subratllat fa referència a àmbit de classe
| |
− | |}
| |
− |
| |
− |
| |
− | === Instanciació, ús dels objectes ===
| |
− |
| |
− | <pre>
| |
− | Alumne a = new Alumne(); // Instanciació 1
| |
− | Alumne b;
| |
− | b = new Alumne(); // Instanciació 2
| |
− |
| |
− | // Accés atributs
| |
− | a.dni = "52628669T";
| |
− | a.nom = "Alex M.";
| |
− | a.edat = 23; // Error, edat és privat
| |
− |
| |
− | // Ús de mètodes
| |
− | a.setEdat(37);
| |
− | int edat = a.getEdat();
| |
− | System.out.println(a.mostrarInfo());
| |
− |
| |
− | // Àmbit de classe
| |
− | Alumne.totalAlumnes = 2;
| |
− | </pre>
| |
− |
| |
− | La crida als mètodes dels objectes s'anomena ''enviar un missatge'' a un altre objecte
| |
− |
| |
− | Mentre un objecte no s'instància, té un valor a '''null'''. Aquest valor indica que l'objecte té una referència nul·la o sigui que encara no ''apunta'' a cap estructura de memòria.
| |
− |
| |
− | La importància de tot això és que accedir a atributs o mètodes d'objectes sense instanciar (null), és un del errors més freqüents, sobretot en programadors novells
| |
− |
| |
− | <pre>
| |
− | Alumne a = null;
| |
− | Alumne b = a;
| |
− |
| |
− | b.getEdat();
| |
− | </pre>
| |
− |
| |
− |
| |
− | Detecció de l'error (En execució)
| |
− | <pre>
| |
− | Exception in thread "main" java.lang.'''NullPointerException'''
| |
− | at dam.m3.uf4.PasParametres.main(PasParametres.java:10) // Programa : Línia
| |
− | </pre>
| |
− |
| |
− | === Constructors ===
| |
− |
| |
− | Els constructors son els mètodes estàtics que es defineixen a les classes per instanciar els objectes.
| |
− |
| |
− | Per defecte, si no es defineix cap constructor, Java assumeix la existència d'un genèric sense paràmetres
| |
− |
| |
− | <pre>
| |
− | Alumne a = new Alumne();
| |
− | </pre>
| |
− |
| |
− |
| |
− | Però també es poden definir múltiples constructors diferents que permetin instanciar els objectes de maneres diferents depenent de la necessitat.
| |
− |
| |
− | Normalment s'utilitza els constructors per inicialitzar els atributs directament en el moment de crear-los.
| |
− |
| |
− | [[File: alumne2.jpg]]
| |
− |
| |
− | <pre>
| |
− | Alumne a = new Alumne("52628669T", "Alex M", 37);
| |
− | </pre>
| |
− |
| |
− |
| |
− | === Destructuros ===
| |
− |
| |
− | El llenguatge Java no requereix de destructors, el pròpia MV s'encarrega de destruir els objectes innecessaris i reciclar els recursos que feia servir. (Garbage Collector)
| |
− |
| |
− |
| |
− | Bàsicament es tracta d'identificar els objectes que perden totes les referències, o dit d'una altra manera, els objectes que queden inaccessibles.
| |
− |
| |
− | <pre>
| |
− | Alumne a = new Alumne();
| |
− | Alumne b = new Alumne();
| |
− |
| |
− | // "a" fa referència a un objecte oid: 1000
| |
− | // "b" fa referència a un objecte oid: 1001
| |
− |
| |
− | b = a;
| |
− |
| |
− | // L'objecte oid:1000 ara té 2 referències
| |
− | // L'objecte oid:1001 no té cap referència, ja no s'hi pot accedir
| |
− | </pre>
| |
− |
| |
− |
| |
− | El procés "Garbage Collector", s'executa en background de manera transparent a l'usuari, i en principi abans d'alliberar un objecte crida al mètode ''finalize()'' disponible per defecte per a qualsevol objecte.
| |
− |
| |
− | El desavantatge és que l'usuari no té control sobre el moment en que això succeeix, i per tant no és un mètode recomanable de fer servir.
| |
− |
| |
− | === Referències ===
| |
− |
| |
− | Un objecte és una entitat complexa i pot arribar a contenir molta informació, cadascun dels objectes del sistema s'identifica per un '''oid''' únic.
| |
− |
| |
− |
| |
− | Cal anar en compte quan es treballa amb objectes perquè vàries variables poden fer referència al mateix objecte i per tant aquest pot ser modificat des de diferents llocs del programa.
| |
− |
| |
− | <pre>
| |
− | Alumne a = new Alumne();
| |
− | Alumne b = new Alumne();
| |
− |
| |
− | a.nom = "Alex M.";
| |
− | b.nom = "Pep G.";
| |
− |
| |
− | b = a; // L'objecte b deixa d'existir pq perd la única referència que tenia
| |
− |
| |
− | System.out.println(b.nom); // Mostra "Alex M."
| |
− | </pre>
| |
− |
| |
− |
| |
− | En cas que es necessiti una còpia de l'objecte, o sigui un altre objecte amb els mateixos valors als atributs.
| |
− |
| |
− | Es pot implementar un mètode ''clone()'' a la classe corresponent
| |
− |
| |
− | <pre>
| |
− | Alumne a = new Alumne();
| |
− |
| |
− | Alumne b = a.clone(); // b és un altre objecte amb el mateix estat (mateixos valors)
| |
− | </pre>
| |
− |
| |
− |
| |
− | A més cal tenir en compte les comparacions d'objectes, sempre s'ha de fer servir el mètode ''equals()''
| |
− |
| |
− | <pre>
| |
− | Alumne a = new Alumne();
| |
− | a.dni = "52628669T";
| |
− | a.nom = "Alex M.";
| |
− |
| |
− | Alumne b = new Alumne();
| |
− | b.dni = "52628669T";
| |
− | b.nom = "Alex M.";
| |
− |
| |
− | System.out.println(a == b); // Retorna false. Compara referències
| |
− |
| |
− | System.out.println(a.equals(b)); // Retorna true. Compara valors
| |
− | </pre>
| |
− |
| |
− | == Tipus primitius vs Objectes ==
| |
− |
| |
− | Els tipus primitius : [[DAM-M3-UF4._Sintaxi#Declaraci.C3.B3_de_variables_i_assignaci.C3.B3]]
| |
− |
| |
− | Identificar-los és immediat.
| |
− |
| |
− | *Els tipus primitius comencen amb minúscules
| |
− |
| |
− | *Els objectes comencen amb majúscules
| |
− |
| |
− | Tots els tipus primitius tenen una classe associada anomenada '''wrapper''' (Envolcall).
| |
− |
| |
− | Cada envolcall permet emmagatzemar el valor del tipus primitiu, i alhora ofereix mètodes d'utilitat (p.e. conversió entre tipus) i constants (valor màxim, mínim, etc...)
| |
− |
| |
− | Exemples són
| |
− |
| |
− | {| class="wikitable"
| |
− | ! Primitiu
| |
− | ! Envolcall
| |
− | |-
| |
− | | int
| |
− | | Interger
| |
− | |-
| |
− | | double
| |
− | | Double
| |
− | |-
| |
− | | boolean
| |
− | | Boolean
| |
− | |}
| |
− |
| |
− | === Conversions de tipus ===
| |
− |
| |
− | {| cellspacing="0" cellpadding="7" border="1"
| |
− | |-
| |
− | | bgcolor="#d9d9d9" | '''Tipus de conversió'''
| |
− | | bgcolor="#d9d9d9" | '''Com fer-ho'''
| |
− | | bgcolor="#d9d9d9" | '''Exemple'''
| |
− | |-
| |
− | | Integer a partir de int
| |
− | | Integer ii = new Integer(i);<br />on i és un int
| |
− | | Integer ii = new Integer(2);
| |
− | |-
| |
− | | rowspan="2" | Integer a partir de String
| |
− | | Integer ii= new Integer(s);<br />on s és un String
| |
− | | Integer ii = new Integer("2");
| |
− | |-
| |
− | | Integer ii = Integer.valueOf(s);<br />on s és un String
| |
− | | ii = Integer.valueOf("2");
| |
− | |-
| |
− | | int a partir de String
| |
− | | int i = Integer.parseInt(s);<br />on s és un String
| |
− | | int i = Integer.parseInt("2");
| |
− | |-
| |
− | | int a partir de Integer
| |
− | | int i = ii.intValue();<br />on ii és un Integer
| |
− | | int i = ii.intValue();
| |
− | |-
| |
− | | String a partir de Integer
| |
− | | String s = ii.toString();<br />on ii és un Integer
| |
− | | String s = ii.toString();
| |
− | |-
| |
− | | String a partir de int
| |
− | | String s = String.valueOf(i);<br />on i és un int
| |
− | | String s = String.valueOf(2);
| |
− | |-
| |
− | | String a partir de boolean
| |
− | | String s = String.valueOf(b);<br />on b és un boolean
| |
− | | String s = String.valueOf(false);
| |
− | |-
| |
− | | String a partir de char
| |
− | | String s = String.valueOf(c);<br />on c és un char
| |
− | | <br />
| |
− | |-
| |
− | | String a partir de float
| |
− | | String s = String.valueOf(f);<br />on f és un float
| |
− | | <br />
| |
− | |}
| |
− |
| |
− | == Gestió de memòria. Estàtica vs Dinàmica ==
| |
− |
| |
− | (Pendent)
| |