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:
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.
Implementar una clase llamada Operacion. Definir dos métodos estáticos que permitan sumar y restar dos valores enteros.
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:
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.
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.
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:
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:
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();
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:
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:
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.