Listado completo de tutoriales

65 - Métodos estáticos de una clase


Así como una clase puede tener atributos estáticos, Java también permite definir métodos estáticos que se crean independientemente a la definición de objetos. Un método estático puede llamarse sin tener que crear un objeto de dicha clase.

Igual que los atributos estáticos, un método estático tiene ciertas restricciones:

  • No puede acceder a los atributos de la clase (salvo que sean estáticos)
  • No puede utilizar el operador this, ya que este método se puede llamar sin tener que crear un objeto de la clase.
  • Puede llamar a otro método siempre y cuando sea estático.
  • Un método estático es lo más parecido a lo que son las funciones en los lenguajes estructurados (con la diferencia que se encuentra encapsulado en una clase)

Si recordamos cada vez que creamos un programa en Java debemos especificar el método main:

public static void main(String[] args)

El método main es estático para que la máquina virtual de Java pueda llamarlo directamente sin tener que crear un objeto de la clase que lo contiene.

Problema

Implementar una clase llamada Operacion. Definir dos métodos estáticos que permitan sumar y restar dos valores enteros.

Programa:

Ver video
public class Operacion {

    public static int sumar(int x1, int x2) {
        int s = x1 + x2;
        return s;
    }

    public static int restar(int x1, int x2) {
        int r = x1 - x2;
        return r;
    }
}

public class PruebaOperacion {
    public static void main(String[] ar) {
        System.out.print("La suma de 2+4 es ");
        System.out.println(Operacion.sumar(2, 4));
        System.out.print("La resta de 6-2 es ");
        System.out.println(Operacion.restar(6, 2));
    }
}

La ejecución del proyecto genera una salida:

java métodos estáticos

Agregamos la palabra clave 'static' antes de indicar el valor que retorna el método:

    public static int sumar(int x1, int x2) {
        int s = x1 + x2;
        return s;
    }

Luego cuando llamamos al método estático lo hacemos antecediendo el nombre de la clase:

        System.out.println(Operacion.sumar(2, 4));

Es importante notar que no se crean objetos de la clase Operacion para poder llamar a los métodos sumar y restar.

No es obligatorio que una clase defina todos sus métodos estáticos, veremos con un ejemplo como podemos tener métodos estáticos y no estáticos.

Problema

Declarar una clase Persona con los atributos nombre y edad. Definir un método estático que reciba como parámetros dos objetos de la clase Persona y me retorne la que tiene una edad mayor, si son iguales retorne cualquiera de las dos.

Programa:

Ver video
public class Persona {
    private String nombre;
    private int edad;

    public Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    public void imprimir() {
        System.out.println(this.nombre + " " + this.edad);
    }

    public static Persona mayor(Persona per1, Persona per2) {
        if (per1.edad >= per2.edad)
            return per1;
        else
            return per2;
    }

}

public class PruebaPersona {

    public static void main(String[] args) {
        Persona persona1 = new Persona("Juan", 33);
        Persona persona2 = new Persona("Ana", 50);
        persona1.imprimir();
        persona2.imprimir();
        Persona personaMayor = Persona.mayor(persona1, persona2);
        System.out.println("Persona con mayor edad");
        personaMayor.imprimir();
    }

}

La ejecución del proyecto genera una salida:

java métodos estáticos

El método 'mayor' no puede acceder a los atributos edad y nombre de la clase Persona, pero si puede acceder al atributo 'edad' de cada uno de los parámetros:

    public static Persona mayor(Persona per1, Persona per2) {
        if (per1.edad >= per2.edad)
            return per1;
        else
            return per2;
    }

El método 'mayor' retorna la referencia de alguno de los dos objetos que llegan como parámetro.

Para llamar al método mayor lo hacemos a través de la clase Persona y le pasamos la referencia de dos instancias de la clase Persona llamados 'persona1' y 'persona2' que previamente creamos:

        Persona personaMayor = Persona.mayor(persona1, persona2);
        System.out.println("Persona con mayor edad");
        personaMayor.imprimir();

No es la única forma que podemos resolver este problema, si no queremos utilizar un método estático en la clase Persona luego la solución es:

Programa:

public class Persona {
    private String nombre;
    private int edad;

    public Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    public void imprimir() {
        System.out.println(this.nombre + " " + this.edad);
    }

    public Persona mayor(Persona per) {
        if (this.edad >= per.edad)
            return this;
        else
            return per;
    }

}
public class PruebaPersona {

    public static void main(String[] args) {
        Persona persona1 = new Persona("Juan", 33);
        Persona persona2 = new Persona("Ana", 50);
        persona1.imprimir();
        persona2.imprimir();
        Persona personaMayor = persona1.mayor(persona2);
        System.out.println("Persona con mayor edad");
        personaMayor.imprimir();
    }

}

Ahora el método 'mayor' no es estático y recibe como parámetro un objeto de la clase Persona y lo compara con el atributo 'edad' de la instancia de la clase respectiva:

    public Persona mayor(Persona per) {
        if (this.edad >= per.edad)
            return this;
        else
            return per;
    }

Para llamar al método 'mayor' debemos hacerlo obligatoriamente a partir de una instancia de la clase 'Persona':

        Persona personaMayor = persona1.mayor(persona2);
        System.out.println("Persona con mayor edad");
        personaMayor.imprimir();

Ejemplos de métodos estáticos en las clases estándares de Java

Ver video

Existen una gran cantidad de clases en los paquetes que suministra Java que contienen métodos estáticos, pasemos a recordar muchos que vimos en conceptos anteriores y otros nuevos.

  • La clase Math tiene una gran cantidad de métodos estáticos:

     sin, cos, tan, asin, acos, atan, toRadians, toDegrees, exp, log, log10, sqrt, cbrt,
    IEEEremainder, ceil, floor, rint, atan2, pow, round, random, addExact, subtractExact,
    multiplyExact, incrementExact, decrementExact, negateExact, toIntExact, multiplyFull,
    multiplyHigh, floorDiv, floorMod, abs, max, min, fma, ulp, signum, sinh, cosh, tanh,
    hypot, expm1, log1p, copySign, getExponent, nextAfter, nextUp, nextDown, scalb, 
    powerOfTwoD, powerOfTwoF
    

    En Eclipse cuando escribimos el nombre del método estático aparece una 's' en el ícono, además del nombre, parámetros y descripción del mismo:

    java métodos estáticos clase Math
  • La clase String tiene los métodos estáticos:

     format, valueOf, copyValueOf, join.
    

    Un ejemplo llamando a los métodos estáticos valueOf y format:

    public class PruebaString {
        public static void main(String[] args) {
            String s1 = "uno";
            String s2 = "dos";
            System.out.println(String.format("La primer cadena %s y la segunda cadena %s", s1, s2));
            int x = 10;
            String cadena = String.valueOf(x);
            System.out.println(cadena);
        }
    }
    
  • La clase Integer tiene los métodos estáticos:

     parseInt, parseUnsignedInt, hashCode, getInteger, decode, compare,
    compareUnsigned, toUnsignedLong, divideUnsigned, remainderUnsigned,
    highestOneBit, lowestOneBit, numberOfLeadingZeros, numberOfTrailingZeros,
    bitCount, rotateLeft, rotateRight, reverse, signum, reverseBytes,
    sum, max, min, toString, toStringUTF16, toUnsignedString,
    toHexString, toOctalString, toBinaryString, toUnsignedString0
    

    Un ejemplo llamando a varios de estos métodos estáticos:

    java métodos estáticos clase Integer

El objetivo de mostrar los métodos estáticos de las clases más comunes del API de Java es hacer notar que son ampliamente utilizados.


Retornar