diumenge, 31 de març del 2013

Keyword static - JAVA

La paraula clau static, en Java, defineix un membre d'una classe que s'utilitzarà de manera independent als objectes d'aquesta classe. Podem utilitzar static en atributs (variables) i/o métodes. Si definim un atribut com a static no es crean còpies d'aquesta atribut, sinó que  tots els objectes creats a partir d'aquesta classe compartiran el mateix valor.

Normalment, s'accedeix a un membre d'una classe a través d'un objecte d'aquesta (instanciació). No obstant, quan declarem un membre com a static podrem accedir a aquest abans de crear objectes d'aquesta classe i sense referències a cap objecte.

L'escriptor suïs Robert Walser


Si ens fixem en el codi de l'entrada anterior veiem que no ens ha calgut crear o instanciar cap objecte de la classe exempleOl per a cridar els diferents métodes sobrecarregats. En aquest exemple, estem cridant métodes que es troben dins de la mateixa classe. Si vulguessim executar métodes d'una altra classe
només hauríem d'especificar el nom d'aquesta seguit de l'operador punt i el métode en qüestió:

nomClasse.nomMetodeEstatic

Els métodes static tenen una sèrie de restriccions:

  • Només poden invocar directament altres métodes static
  • Només poden accedir directament a dades static
  • No tenen una referència this

Blocs estàtics

En ocasions, una classe requereix certa inicialització abans de que es puguin crear objectes d'aquesta. Per exemple, podem necessitar establir una connexió a una base de dades o inicialitzar determinades variables static. En aquests casos, Java permet declarar un bloc static que s'executarà al carregar la classe per primera vegada. Veiem-ne un exemple:


public class StaticBlock {

    static double valor1;
    static double valor2;

    static { // Aquest bloc s'executarà al carregar la classe

        System.out.println("Dins el bloc estàtic");
        valor1 = Math.sqrt(2.0);
        valor2 = Math.sqrt(3.0);
        
    }

    public StaticBlock(String msg) {
        System.out.println(msg);
    }

}

class SDemo {
    public static void main(String[] args) {
        StaticBlock ob = new StaticBlock("Dins el constructor");

        System.out.println("Valor1: "+StaticBlock.valor1);
        System.out.println("Valor2: "+StaticBlock.valor2);
    }
}


El resultat generat és el següent:

Dins el bloc estàtic
Dins el constructor

Valor1: 1.4142135623730951
Valor2: 1.7320508075688772

dissabte, 30 de març del 2013

Sobrecàrrega de métodes en JAVA

En Java, dos o més métodes de la mateixa classe poden compartir el mateix nom sempre i quan la seva signatura ,el número i/o tipus de paràmetre, sigui diferent. Aquesta técnica s'anomena sobrecàrrega de métodes o overloading. Veiem-ne un exemple:

class exempleOl {

    static void metodeCalcular(int x) {

        System.out.println("int");

    }

    static void metodeCalcular(long x) {

        System.out.println("long");

    }

    static void metodeCalcular(float x) {

        System.out.println("float");

    }

    static void metodeCalcular(double x) {

        System.out.println("double");

    }

    public static void main(String[] args) {

        int i = 5;
        long l = 12;
        float d = 5.0f;
        byte b = 2;
        short s = 5;

        metodeCalcular(i);
        metodeCalcular(l);
        metodeCalcular(d);
        metodeCalcular(b);
        metodeCalcular(s);

    }
}
La sortida serà la següent:

int long double int int

L'ordre d'execució és de menor a major tipus de dada. Com no existeix un métode per al tipus primitiu byte o short, el compilador executa el métode del tipus int, ja que int permet encabir valors de tipus byte o short (conversió de tipus).
És per això que quan cridem a metodeCalcular() amb un byte o short com argument, s'executarà metodeCalcular(int x).

Regles per a la sobrecàrrega de métodes:
  • Han de canviar la llista d'arguments (el tipus o número de paràmetres del métode).
  • Poden canviar el tipus de retorn del métode.
  • Poden canviar el modificador d'accés.
  • Poden declarar nous tipus d'excepcions o ampliar-les.
  • Un métode pot ser sobrecarregat en la mateixa classe o en una subclasse.
De la mateixa manera que els métodes, els constructors també poden ser sobrecarregats. Així, podem crear objectes de diferents maneres en funció del constructor cridat alhora d'instanciar una classe.