Diferència entre revisions de la pàgina «DAM-M3-UF4. Introducció»

De Wiki IES Marianao. Departament Informàtica
Dreceres ràpides: navegació, cerca
(Descripció estàtica. Atributs)
(Les Classes i els objectes)
Línia 25: Línia 25:
 
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.
 
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
+
Es poden descriure els objectes o instàncies des d’un punt vista
  
* Estàtic: El valor de les seves propietats, '''atributs''' (''Estat'')
+
* Estat de l'objecte: El valor de les seves propietats, '''atributs'''
* Dinàmica: Com respon a esdeveniments externs, '''mètodes''' (''Comportament'')
+
* Comportament de l'objecte: Com respon a esdeveniments externs, '''mètodes'''
  
 
[[File: ObjectClass.png]]
 
[[File: ObjectClass.png]]
  
  
=== Descripció estàtica. Atributs ===
+
 
 +
=== Classe. Sintaxis ===
 +
 
 +
La estructura d'una classe ''normal'' a Java és
 +
 
 +
<pre>
 +
public class NomClasse {
 +
    {constants}
 +
 
 +
    {atributs}
 +
 
 +
    {constructors}
 +
 
 +
    {getters / setters}
 +
 
 +
    {altres mètodes}
 +
}
 +
</pre>
 +
 
 +
Per conveni:
 +
* El '''nom de la classe comença amb majúscules'''.
 +
* El nom dels '''atributs i mètodes comencen en minúscules'''.
 +
* Si consten de vàries paraules, van seguides (sense espais o altres caràcters) i cada nova paraula comença amb majúscules. '''CamelCase'''
 +
* Primer van els atributs: constants i atributs normals.
 +
* Les constants van tots en majúscules i les paraules es separen per "_"
 +
* Després els mètodes: constructors, getters/setters i altres.
 +
 
 +
Les classes de Java poden ser:
 +
* '''public''': Accessibles
 +
* Sense modificador: Accessibles només des del mateix paquet.
 +
 
 +
A més per establir utilitza els modificadors: abstract, final, synchronizable
 +
 
 +
* '''abstract''': Té mínim un mètode ''abstract ''que cal implementar (Herència).
 +
* '''final''': no admet subclasses.
 +
* '''syncronizable''': Per al tractament de ''fils'' (Threads). Tots els mètodes estan sincronitzats, no s’hi pot accedir des de diferents ''fils'' al mateix temps.
 +
 
 +
 
 +
 
 +
 
 +
=== Visibilitat ===
 +
 
 +
Cal anar en compte amb els paquets que poden donar visions errònies de la visibilitat.
 +
 
 +
{| cellspacing="0" cellpadding="4" border="1"
 +
|-
 +
| Visibilitat (des de ...)
 +
| public
 +
| protected
 +
| private
 +
| default
 +
|-
 +
| La pròpia classe
 +
| Sí
 +
| Sí
 +
| Sí
 +
| Sí
 +
|-
 +
| Una altra classe del propi paquet
 +
| Sí
 +
| Sí
 +
| No
 +
| Sí
 +
|-
 +
| Una altra classe fora del paquet
 +
| Sí
 +
| No
 +
| No
 +
| No
 +
|-
 +
| Una subclasse del propi paquet
 +
| Sí
 +
| Sí
 +
| No
 +
| Sí
 +
|-
 +
| Una subclasse fora del propi paquet
 +
| Sí
 +
| Sí
 +
| No
 +
| No
 +
|}
 +
 
 +
 
 +
 
 +
 
 +
=== Descripció de l'estat. Atributs i dades ===
  
 
Els atributs, poden ser de dos tipus segons l’àmbit:
 
Els atributs, poden ser de dos tipus segons l’àmbit:
  
* Atributs '''d’instància''' poden tenir un valor diferent per a cada objecte o instància.
+
* Atributs '''d’instància'''  
* Atributs '''de classe''' o '''estàtics'''. Independent de les instàncies (objectes) de la 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.
+
** Cada objecte o instància té el seu propi conjunt de valors per tots aquests atributs
 +
** Poden tenir un valor diferent per a cada objecte o instància.
 +
** S'accedeix a cada atribut a través de l'objecte o instància
 +
* Atributs '''de classe''' o '''estàtics'''.  
 +
** Independent de les instàncies (objectes) de la classe
 +
** Només hi ha una còpia de l'atribut que comparteixen tots els objectes de la classe
 +
** S'accedeix als atributs estàtics directament amb la classe
  
 
Es defineixen diferents nivells d’accés sobre els atributs, de manera general:
 
Es defineixen diferents nivells d’accés sobre els atributs, de manera general:
Línia 44: Línia 136:
 
* Visibilitat '''pública''': Atributs accessibles externament.
 
* Visibilitat '''pública''': Atributs accessibles externament.
 
* Visibilitat '''privada''': Només accessibles internament.
 
* Visibilitat '''privada''': Només accessibles internament.
* Visibilitat '''protegida''': Només accessibles internament i des dels descendents.
+
* Visibilitat '''protegida''': Només accessibles internament i descendents descendents.
 +
 
 +
 
 +
=== Atributs. Sintaxis ===
 +
 
 +
Els atributs defineixen l'estat dels objectes de la classe. Tots els objectes de la classe tenen els mateixos atributs però amb valors diferents.
 +
 
 +
Aquests es poden precedir de modificadors que en determinen l’accés i el tipus. Els '''modificadors d’accés''' determinen la visibilitat dels atributs:
 +
* Sense modificador, accessible des de les classes del mateix paquet
 +
* '''private''', accessible des de la pròpia classe
 +
* '''protected''', accessible des de la pròpia classe i subclasses
 +
* '''public''', totalment accessibles
 +
 
 +
En general els atributs sempre són ''private'' (o ''protected''). Les constants poden ser públiques si són d'utilitat.
 +
 
 +
Els '''modificadors de tipus''':
 +
* '''static''', atribut de classe o estàtic
 +
* '''final''', constant, el valor no pot canviar després de ser inicialitzat.
 +
 
 +
Aquests dos modificadors s'utilitza per declarar constants per exemple. La constant és independent de les instàncies o objectes (estàtic) i no s'ha de poder modificar el valor inicial (final).
 +
 
 +
<pre>
 +
public class Alumne {
 +
    public static final int MAX_ALUMNES = 30;
 +
    private static int totalAlumnes;
 +
    private String dni;
 +
    private String nom;
 +
    private int edat;
 +
}
 +
</pre>
 +
 
  
=== Descripció dinàmica. Mètodes  ===
+
 
 +
=== Descripció del comportament. Mètodes  ===
  
  
Línia 82: Línia 205:
 
Subratllat fa referència a àmbit de classe
 
Subratllat fa referència a àmbit de classe
 
|}
 
|}
 +
 +
 +
 +
=== Mètodes. Sintaxis ===
 +
 +
Els mètodes determinen el comportament, permeten la comunicació entre objectes.
 +
 +
Aquests també poden anar precedits de modificadors que en determinen l’accés i el tipus.
 +
 +
Els '''Modificadors d’accés''' determinen la visibilitat dels mètodes i són els mateixos que per als atributs: ''Sense modificador'', ''private'', ''protected'', ''public.''
 +
 +
En general els mètodes seran públics excepte si són mètodes d'utilitat interns de la classe (privat / protected)
 +
 +
'''Els modificadors de tipus, '''
 +
 +
* '''static''', mètode de classe o estàtic
 +
* '''abstract''', mètode no implementat, cal reescriure’l en els descendents (Herència).
 +
* '''final''', el mètode no pot ser sobreescrit en cap dels descendents
 +
* '''syncronizable''', tractament ''multifil''.
 +
 +
 +
 +
==== Sobrecàrrega de mètodes (Overload) ====
 +
 +
Java permet la sobrecàrrega de mètodes, que consisteix en tenir mètodes amb el mateix nom però amb una llista diferent de paràmetres, així en '''temps de compilació''' es pot determinar quin dels mètodes cal fer servir.
 +
 +
(No confondre amb '''sobreescriptura''' que es resol en temps d'execució).
 +
 +
Això es fa servir per exemple si algun dels paràmetres és opcional.
 +
 +
<pre>
 +
    public void incrementaEdat() {
 +
        edat++;
 +
    }
 +
    public void incrementaEdat(int inc) {
 +
        edat += inc;
 +
    }
 +
</pre>
 +
 +
 +
Un exemple de sobrecàrrega el tenim al mètode ''println''
 +
 +
 +
[http://docs.oracle.com/javase/6/docs/api/java/io/PrintStream.html#println%28%29 http://docs.oracle.com/javase/6/docs/api/java/io/PrintStream.html#println%28%29]
 +
 +
 +
 +
==== Constructors ====
 +
 +
 +
Els constructors són mètodes de classe que permeten crear instàncies (objectes) de la classe.
 +
 +
Tenen el mateix nom que la classe i en general es poden sobrecarregar.
 +
 +
Si no existeix cap constructor per a una classe, Java sobreentén la existència d'un constructor sense paràmetres que només instància objectes.
 +
 +
Normalment es crea un constructor per a cada forma de crear objectes que sigui necessària, per exemple per inicialitzar tots els atributs, només alguns, etc...
 +
 +
<pre>
 +
public class Alumne {
 +
    public static final int MAX_ALUMNES = 30;
 +
    private static int totalAlumnes;
 +
    private String dni;
 +
    private String nom;
 +
    private int edat;
 +
 +
    public Alumne(String dni, String nom, int edat) {
 +
        super();
 +
        this.dni = dni;
 +
        this.nom = nom;
 +
        this.edat = edat;
 +
        totalAlumnes++;
 +
    }
 +
 +
    public Alumne(String dni, String nom) {
 +
        super();
 +
        this.dni = dni;
 +
        this.nom = nom;
 +
        this.edat = 18;
 +
        totalAlumnes++;
 +
    }
 +
    ....
 +
}
 +
</pre>
 +
 +
 +
La paraula ''this'' fa referència a la pròpia classe, serveix per exemple diferenciar entre l'atribut i el paràmetre del mètode.
 +
 +
 +
 +
==== Getters / Setters ====
 +
 +
 +
Els getters/setters permeten accedir i modificar els atributs dels objectes. Cal recordar que per norma aquests són privats (sense accés des de fora).
 +
 +
En general la classe ofereix un getter i un setter per a cada atribut
 +
 +
<pre>
 +
public class Alumne {
 +
    public static final int MAX_ALUMNES = 30;
 +
    private static int totalAlumnes;
 +
    private String dni;
 +
    private String nom;
 +
    private int edat;
 +
 +
    public static int getTotalAlumnes() {
 +
        return totalAlumnes;
 +
    }
 +
    public static void setTotalAlumnes(int totalAlumnes) {
 +
        Alumne.totalAlumnes = totalAlumnes;
 +
    }
 +
    public String getDni() {
 +
        return dni;
 +
    }
 +
    public void setDni(String dni) {
 +
        this.dni = dni;
 +
    }
 +
    ....
 +
}
 +
</pre>
 +
  
 
=== Instanciació, ús dels objectes ===
 
=== Instanciació, ús dels objectes ===
Línia 100: Línia 344:
 
         System.out.println(a.mostrarInfo());
 
         System.out.println(a.mostrarInfo());
 
</pre>
 
</pre>
 +
  
 
La crida als mètodes dels objectes s'anomena ''enviar un missatge'' a un altre objecte
 
La crida als mètodes dels objectes s'anomena ''enviar un missatge'' a un altre objecte
Línia 122: Línia 367:
  
  
''Àmbit de classe (static)''
+
''Àmbit de classe o estàtic''
  
 
En aquest cas tant per atributs com per a mètodes, com només existeix una còpia per a totes les instàncies, s'accedeix utilitzant el nom de la classe.
 
En aquest cas tant per atributs com per a mètodes, com només existeix una còpia per a totes les instàncies, s'accedeix utilitzant el nom de la classe.
Línia 133: Línia 378:
 
         int total = Alumne.getTotalAlumnes();
 
         int total = Alumne.getTotalAlumnes();
 
</pre>
 
</pre>
 +
  
  
Línia 159: Línia 405:
  
 
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.
 
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 ===
 
=== Referències ===
Línia 206: Línia 454:
 
         System.out.println(a.equals(b)); // Retorna true. Compara valors
 
         System.out.println(a.equals(b)); // Retorna true. Compara valors
 
</pre>
 
</pre>
 
  
 
==  Concepte de Classe  ==
 
==  Concepte de Classe  ==

Revisió del 16:10, 22 set 2018

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 o instàncies des d’un punt vista

  • Estat de l'objecte: El valor de les seves propietats, atributs
  • Comportament de l'objecte: Com respon a esdeveniments externs, mètodes

ObjectClass.png


Classe. Sintaxis

La estructura d'una classe normal a Java és

public class NomClasse {
     {constants}

     {atributs}

     {constructors}

     {getters / setters}

     {altres mètodes}
}

Per conveni:

  • El nom de la classe comença amb majúscules.
  • El nom dels atributs i mètodes comencen en minúscules.
  • Si consten de vàries paraules, van seguides (sense espais o altres caràcters) i cada nova paraula comença amb majúscules. CamelCase
  • Primer van els atributs: constants i atributs normals.
  • Les constants van tots en majúscules i les paraules es separen per "_"
  • Després els mètodes: constructors, getters/setters i altres.

Les classes de Java poden ser:

  • public: Accessibles
  • Sense modificador: Accessibles només des del mateix paquet.

A més per establir utilitza els modificadors: abstract, final, synchronizable

  • abstract: Té mínim un mètode abstract que cal implementar (Herència).
  • final: no admet subclasses.
  • syncronizable: Per al tractament de fils (Threads). Tots els mètodes estan sincronitzats, no s’hi pot accedir des de diferents fils al mateix temps.



Visibilitat

Cal anar en compte amb els paquets que poden donar visions errònies de la visibilitat.

Visibilitat (des de ...) public protected private default
La pròpia classe
Una altra classe del propi paquet No
Una altra classe fora del paquet No No No
Una subclasse del propi paquet No
Una subclasse fora del propi paquet No No



Descripció de l'estat. Atributs i dades

Els atributs, poden ser de dos tipus segons l’àmbit:

  • Atributs d’instància
    • Cada objecte o instància té el seu propi conjunt de valors per tots aquests atributs
    • Poden tenir un valor diferent per a cada objecte o instància.
    • S'accedeix a cada atribut a través de l'objecte o instància
  • Atributs de classe o estàtics.
    • Independent de les instàncies (objectes) de la classe
    • Només hi ha una còpia de l'atribut que comparteixen tots els objectes de la classe
    • S'accedeix als atributs estàtics directament amb 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 descendents descendents.


Atributs. Sintaxis

Els atributs defineixen l'estat dels objectes de la classe. Tots els objectes de la classe tenen els mateixos atributs però amb valors diferents.

Aquests es poden precedir de modificadors que en determinen l’accés i el tipus. Els modificadors d’accés determinen la visibilitat dels atributs:

  • Sense modificador, accessible des de les classes del mateix paquet
  • private, accessible des de la pròpia classe
  • protected, accessible des de la pròpia classe i subclasses
  • public, totalment accessibles

En general els atributs sempre són private (o protected). Les constants poden ser públiques si són d'utilitat.

Els modificadors de tipus:

  • static, atribut de classe o estàtic
  • final, constant, el valor no pot canviar després de ser inicialitzat.

Aquests dos modificadors s'utilitza per declarar constants per exemple. La constant és independent de les instàncies o objectes (estàtic) i no s'ha de poder modificar el valor inicial (final).

public class Alumne {
    public static final int MAX_ALUMNES = 30;
    private static int totalAlumnes;
    private String dni;
    private String nom;
    private int edat;
}


Descripció del comportament. 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
    • Mètodes constructors i destructors
    • Getter/Setter sobre atributs de classe
    • Mètodes d'utilitat de classe (veure mètodes de wrappers tipus primitius: Integer, Double, etc...)


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

Alumne.jpg

(+) Significa public

(-) Significa privat

Subratllat fa referència a àmbit de classe


Mètodes. Sintaxis

Els mètodes determinen el comportament, permeten la comunicació entre objectes.

Aquests també poden anar precedits de modificadors que en determinen l’accés i el tipus.

Els Modificadors d’accés determinen la visibilitat dels mètodes i són els mateixos que per als atributs: Sense modificador, private, protected, public.

En general els mètodes seran públics excepte si són mètodes d'utilitat interns de la classe (privat / protected)

Els modificadors de tipus,

  • static, mètode de classe o estàtic
  • abstract, mètode no implementat, cal reescriure’l en els descendents (Herència).
  • final, el mètode no pot ser sobreescrit en cap dels descendents
  • syncronizable, tractament multifil.


Sobrecàrrega de mètodes (Overload)

Java permet la sobrecàrrega de mètodes, que consisteix en tenir mètodes amb el mateix nom però amb una llista diferent de paràmetres, així en temps de compilació es pot determinar quin dels mètodes cal fer servir.

(No confondre amb sobreescriptura que es resol en temps d'execució).

Això es fa servir per exemple si algun dels paràmetres és opcional.

    public void incrementaEdat() {
        edat++;
    }
    public void incrementaEdat(int inc) {
        edat += inc;
    }


Un exemple de sobrecàrrega el tenim al mètode println


http://docs.oracle.com/javase/6/docs/api/java/io/PrintStream.html#println%28%29


Constructors

Els constructors són mètodes de classe que permeten crear instàncies (objectes) de la classe.

Tenen el mateix nom que la classe i en general es poden sobrecarregar.

Si no existeix cap constructor per a una classe, Java sobreentén la existència d'un constructor sense paràmetres que només instància objectes.

Normalment es crea un constructor per a cada forma de crear objectes que sigui necessària, per exemple per inicialitzar tots els atributs, només alguns, etc...

public class Alumne {
    public static final int MAX_ALUMNES = 30;
    private static int totalAlumnes;
    private String dni;
    private String nom;
    private int edat;

    public Alumne(String dni, String nom, int edat) {
        super();
        this.dni = dni;
        this.nom = nom;
        this.edat = edat;
        totalAlumnes++;
    }

    public Alumne(String dni, String nom) {
        super();
        this.dni = dni;
        this.nom = nom;
        this.edat = 18;
        totalAlumnes++;
    }
    ....
}


La paraula this fa referència a la pròpia classe, serveix per exemple diferenciar entre l'atribut i el paràmetre del mètode.


Getters / Setters

Els getters/setters permeten accedir i modificar els atributs dels objectes. Cal recordar que per norma aquests són privats (sense accés des de fora).

En general la classe ofereix un getter i un setter per a cada atribut

public class Alumne {
    public static final int MAX_ALUMNES = 30;
    private static int totalAlumnes;
    private String dni;
    private String nom;
    private int edat;

    public static int getTotalAlumnes() {
        return totalAlumnes;
    }
    public static void setTotalAlumnes(int totalAlumnes) {
        Alumne.totalAlumnes = totalAlumnes;
    }
    public String getDni() {
        return dni;
    }
    public void setDni(String dni) {
        this.dni = dni;
    }
    ....
}


Instanciació, ús dels objectes

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


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

        Alumne a = null;
        Alumne b = a;
               
        b.getEdat();


Detecció de l'error (En execució)

Exception in thread "main" java.lang.'''NullPointerException'''
    at dam.m3.uf4.PasParametres.main(PasParametres.java:10)    // Programa : Línia         


Àmbit de classe o estàtic

En aquest cas tant per atributs com per a mètodes, com només existeix una còpia per a totes les instàncies, s'accedeix utilitzant el nom de la classe.

  // Àmbit de classe
        Alumne.totalAlumnes = 2;

  // Àmbit de classe
        int total = Alumne.getTotalAlumnes();


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.

        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


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.

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


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

        Alumne a = new Alumne();
   
        Alumne b = a.clone();  // b és un altre objecte amb el mateix estat (mateixos valors)


A més cal tenir en compte les comparacions d'objectes, sempre s'ha de fer servir el mètode equals()

        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

Concepte de Classe

Estructura i membres

DAM-M3-UF4._Caracterització_i_ús_d'objectes#Les_Classes_i_els_objectes

La estructura d'una classe normal a Java és

public class NomClasse {
     {constants}

     {atributs}

     {constructors}

     {getters / setters}

     {altres mètodes}
}

Per conveni:

  • El nom de la classe comença amb majúscules.
  • El nom dels atributs i mètodes comencen en minúscules.
  • Si consten de vàries paraules, van seguides (sense espais o altres caràcters) i cada nova paraula comença amb majúscules.
  • Primer van els atributs: constants i atributs normals.
  • Després els mètodes: constructors, getters/setters i altres.

Les classes de Java poden ser:

  • public: Accessibles
  • Sense modificador: Accessibles només des del mateix paquet.

A més per establir utilitza els modificadors: abstract, final, synchronizable

  • abstract: Té mínim un mètode abstract que cal implementar.
  • final: no admet subclasses.
  • syncronizable: Per al tractament de fils (Threads). Tots els mètodes estan sincronitzats, no s’hi pot accedir des de diferents fils al mateix temps.

Atributs

Els atributs defineixen l'estat dels objectes de la classe. Tots els objectes de la classe tenen els mateixos atributs però amb valors diferents.

Aquests es poden precedir de modificadors que en determinen l’accés i el tipus. Els modificadors d’accés determinen la visibilitat dels atributs:

  • Sense modificador, accessible des de les classes del mateix paquet
  • private, accessible des de la pròpia classe
  • protected, accessible des de la pròpia classe i subclasses
  • public, totalment accessibles

En general els atributs sempre són private (o protected). Les constants poden ser públiques si són d'utilitat.

Els modificadors de tipus:

  • static, atribut de classe
  • final, constant, el valor no pot canviar després de ser inicialitzat.
public class Alumne {
    public static final int MAX_ALUMNES = 30;
    private static int totalAlumnes;
    private String dni;
    private String nom;
    private int edat;
}

Mètodes

Els mètodes determinen el comportament, permeten la comunicació entre objectes.

Aquests també poden anar precedits de modificadors que en determinen l’accés i el tipus.

Els Modificadors d’accés determinen la visibilitat dels mètodes i són els mateixos que per als atributs: Sense modificador, private, protected, public.

En general els mètodes seran públics excepte si són mètodes d'utilitat interns de la classe (privat / protected)

Els modificadors de tipus,

  • static, mètode de classe
  • abstract, mètode no implementat, cal reescriure’l en els descendents.
  • final, el mètode no pot ser sobreescrit
  • syncronizable, tractament multifil.

Sobrecàrrega de mètodes (Overload)

Java permet la sobrecàrrega de mètodes, que consisteix en tenir mètodes amb el mateix nom però amb una llista diferent de paràmetres, així en temps de compilació es pot determinar quin dels mètodes cal fer servir.

(No confondre amb sobreescriptura que es resol en temps d'execució).

Això es fa servir per exemple si algun dels paràmetres és opcional.

    public void incrementaEdat() {
        edat++;
    }
    public void incrementaEdat(int inc) {
        edat += inc;
    }


Un exemple de sobrecàrrega el tenim al mètode println


http://docs.oracle.com/javase/6/docs/api/java/io/PrintStream.html#println%28%29


Constructors

Els constructors són mètodes de classe que permeten crear instàncies (objectes) de la classe.

Tenen el mateix nom que la classe i en general es poden sobrecarregar.

Si no existeix cap constructor per a una classe, Java sobreentén la existència d'un constructor sense paràmetres que només instància objectes.

Normalment es crea un constructor per a cada forma de crear objectes que sigui necessària, per exemple per inicialitzar tots els atributs, només alguns, etc...

public class Alumne {
    public static final int MAX_ALUMNES = 30;
    private static int totalAlumnes;
    private String dni;
    private String nom;
    private int edat;

    public Alumne(String dni, String nom, int edat) {
        super();
        this.dni = dni;
        this.nom = nom;
        this.edat = edat;
        totalAlumnes++;
    }

    public Alumne(String dni, String nom) {
        super();
        this.dni = dni;
        this.nom = nom;
        this.edat = 18;
        totalAlumnes++;
    }
    ....
}


La paraula this fa referència a la pròpia classe, serveix per exemple diferenciar entre l'atribut i el paràmetre del mètode.

Getters / Setters

Els getters/setters permeten accedir i modificar els atributs dels objectes. Cal recordar que per norma aquests són privats (sense accés des de fora).

En general la classe ofereix un getter i un setter per a cada atribut

public class Alumne {
    public static final int MAX_ALUMNES = 30;
    private static int totalAlumnes;
    private String dni;
    private String nom;
    private int edat;

    public static int getTotalAlumnes() {
        return totalAlumnes;
    }
    public static void setTotalAlumnes(int totalAlumnes) {
        Alumne.totalAlumnes = totalAlumnes;
    }
    public String getDni() {
        return dni;
    }
    public void setDni(String dni) {
        this.dni = dni;
    }
    ....
}

Visibilitat

Cal anar en compte amb els paquets que poden donar visions errònies de la visibilitat.

Visibilitat (des de ...) public protected private default
La pròpia classe
Una altra classe del propi paquet No
Una altra classe fora del paquet No No No
Una subclasse del propi paquet No
Una subclasse fora del propi paquet No No


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

Primitiu Envolcall
int Interger
double Double
boolean Boolean

Conversions de tipus

Tipus de conversió Com fer-ho Exemple
Integer a partir de int Integer ii = new Integer(i);
on i és un int
Integer ii = new Integer(2);
Integer a partir de String Integer ii= new Integer(s);
on s és un String
Integer ii = new Integer("2");
Integer ii = Integer.valueOf(s);
on s és un String
ii = Integer.valueOf("2");
int a partir de String int i = Integer.parseInt(s);
on s és un String
int i = Integer.parseInt("2");
int a partir de Integer int i = ii.intValue();
on ii és un Integer
int i = ii.intValue();
String a partir de Integer String s = ii.toString();
on ii és un Integer
String s = ii.toString();
String a partir de int String s = String.valueOf(i);
on i és un int
String s = String.valueOf(2);
String a partir de boolean String s = String.valueOf(b);
on b és un boolean
String s = String.valueOf(false);
String a partir de char String s = String.valueOf(c);
on c és un char

String a partir de float String s = String.valueOf(f);
on f és un float

Gestió de memòria. Estàtica vs Dinàmica

(Pendent)