|
|
(Hi ha 2 revisions intermèdies del mateix usuari que no es mostren) |
Línia 1: |
Línia 1: |
− | torna [[ M3 - Programació ]]
| |
| | | |
− | == 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
| |
− |
| |
− | <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.
| |
− | * 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.
| |
− |
| |
− | <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>
| |
− |
| |
− | === 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.''
| |
− |
| |
− | '''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.
| |
− |
| |
− | <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
| |
− |
| |
− |
| |
− |
| |
− | ==== 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>
| |
− |
| |
− |
| |
− |
| |
− | ==== 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>
| |
− |
| |
− |
| |
− |
| |
− | === 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
| |
− | |}
| |